Ling to entity实现分页
Ling to entity实现分页
最近用MVC做的一个项目涉及到分页,中间用了entity framework来查数据库,不用直接写sql语句,方便了很多。
一般分页的思路是获得两个变量的值:
1.一共有多少条记录 totalCount;
2.每页有多少个数据 pageSize;
其中totalCount可以查数据库得到,而pageSize一般由程序提前设定好,写在配置文件中,或直接hardcode写死。
有了这两个变量,我们就可以知道一共有多少页数据totalPage,有了这些值,就可以在页面中将分页的页数显示出来。
下面来看对指定的某一页对应的数据库操作:
要知道某一页要呈现的数据,需要有如下两个变量:
1.当前是第几页 currentPage
2.每页有多少个数据 pageSize (第一页和最后一页数据条数可能不足)
其中currentPage可以由页面的url传进来,有了这些值,可以来写数据库查询语句了。
用Entity Framework来写数据库查询很简单,需要用到skip和take这两个函数,如下:
1 public List<Info> ListItem(Query query, int currentPage, int pageSize, out int totalPage)
2 {
3 IEnumerable<Info> items=base.Query.Where(t => t.ID == query.Ids.FirstOrDefault() && (!t.ServerStatus.HasValue||t.ServerStatus.Value != Deleted));
4 int total = items.Count();
5 double pageCount = Math.Ceiling((double)total /(double)pageSize);
6 totalPage =(int)pageCount ;
7 if (currentPage >= totalPage)
8 {
9 currentPage = totalPage;
10 }
11 return items.OrderBy(t => t.ID).Skip((currentPage - 1) * pageSize).Take(pageSize).ToList();
12 }
skip()函数会跳过指定的记录数,Take()函数会将余下的数据的前n条记录拿出来,这样就得到了指定页currentPage的数据。不必担心第一页和最后一页不足pageSize程序会出错,
take函数已经屏蔽了这种错误,比如take(100),这时如果没有100条记录程序也不会异常,有多少条数据就会得到多少条数据。
最后只需要写一个分页的partial生成对应页面的url在需要分页的view里面调用就好,很是方便。
页面的效果:
这面我没有花太多心思在分页工具的美观上,感兴趣的可以将其做得漂亮一些。
总结:entity framework作为微软大力推的一个利器,确实有其很方便的地方,将程序员从手写sql中解放出来,同时期代码的简洁性,也会渐渐取代ling to sql,但由于它最终还是会
生成对应的sql语句去查询数据库,虽然节省了写查询语句的事件,但其生成的sql语句肯定不会比直接手写sql来得简洁,尤其是多表连接,写很复杂的查询语句时,其生成sql语句的时间
和查询性能不是很好的,这在大数据集下有时是致命伤。
有兴趣的朋友可以用sql profile来看看entity生成的sql语句,会有更深的理解。
最新文章
- 常用原生JS方法总结(兼容性写法)
- [Android Pro] PullToRefreshListView怎么设置各个item之间的间距
- JavaScript精要(系列)
- 暴力枚举 + 24点 --- hnu : Cracking the Safe
- tomcat通过socket连接MySQL,不再占用服务端口【linux】
- 关于debug时的一些操作
- The content of element type ";configuration"; must match ";(properties?,settings?,typeAliases?,typeHandlers?,objectFactory?,objectWrapperFactory?,reflectorFactory?,plugins?,environments?,databaseIdProv
- 跟开涛老师学shiro -- 编码/加密
- 【转】8张图理解Java
- codeforces 553A . Kyoya and Colored Balls 组合数学
- IOS 图片全屏预览
- Android开发UI之开源项目第一篇——个性化控件(View)篇
- jsconsole
- Netty实现服务端客户端长连接通讯及心跳检测
- geoR文档翻译
- 使用XIB的UITableViewCell自适应,以及出现的问题进行解决
- [Reinforcement Learning] Model-Free Prediction
- 性能测试 查看Android APP 帧数FPS的方法
- java工具类,在Windows,Linux系统获取电脑的MAC地址、本地IP、电脑名
- DedeCMS后台500错误一种原因是不支持PHP5.3、5.4及以上版本