只是一个用EF写的一个简单的分页方法而已
只是一个用EF写的一个简单的分页方法而已

慢慢的写吧。比如,第一步,先把所有数据查询出来吧。
//第一步。
public IQueryable<UserInfo> LoadPagesForUserInfos(int pageSize, int pageIndex, out int total)
{
DataModelContainer db = new DataModelContainer();
total = db.UserInfo.Count();
return db.UserInfo.Take(pageSize*(pageIndex - )).Skip(pageSize).AsQueryable();
}
第一步,先得到所有查询数据。
第二步。我总不能全查询出来吧,我得有些条件吧。比如我要查id>18的数据。那么得用到Where()扩展方法了。那么就得这么写了。
public IQueryable<UserInfo> LoadPagesInfos(int pageSize, int pageIndex, out int total)
{
DataModelContainer db = new DataModelContainer();
total = db.UserInfo.Where(u => u.ID > ).Count();
return db.UserInfo.Where(u => u.ID > ).Take(pageSize * (pageIndex - )).Take(pageSize).AsQueryable();
}
得有点查询条件吧
第三步,我查询数据的条件,可能会变,比如我现在不查id>18的数据了,我要查id<100的数据或者公司名字叫“小杜的公司”的数据,你总不能老在这里给我改代码吧。那么我们发现,其扩展方法就是传一个委托,一个名传入是UserInfo类型返回值是bool类型的委托,那么我们把这个委托当参数传递过来,让用户传就好了。需要什么用户写好传递过来也就可以了。就很好的做到了对变化点的封装。
public IQueryable<UserInfo> LoadPagesForInfos(int pageSize, int pageIndex, out int total, Func<UserInfo, bool> whereFunc)
{
DataModelContainer db = new DataModelContainer();
total = db.UserInfo.Where(whereFunc).Count();
return db.UserInfo.Where(whereFunc).Skip(pageSize * (pageIndex - )).Take(pageSize).AsQueryable();
}
查询条件让用户传好不
第四步,查询条件现在是可以用户传递的了,可是分页查询总得有一个排序吧。这样就需要用到Order()方法了。下面代码中的Order<UserInfo,int>(u=>u.ID)中接口是约束了这个UserInfo,而后面的int则是约束后面Lambda的返回值的。我们转到定义就可以发现了。当然这个“<>”里的内容也是可以不写的,此处如不写的话是后面的Lambda表示式亦会自动推测出前面的限制是什么的。如同Skip()方法和Take()方法就没有写。那么,优化一下,写一个按id排序的方法吧。
public IQueryable<UserInfo> LoadPagesForInfos(int pageSize, int pageIndex, out int total,
Func<UserInfo, bool> whereFunc)
{
DataModelContainer db = new DataModelContainer();
total = db.UserInfo.Where(whereFunc).Count();
return
db.UserInfo.Where(whereFunc)
.OrderBy<UserInfo, int>(u => u.ID)
.Skip(pageSize * (pageIndex - ))
.Take(pageSize)
.AsQueryable();
}
按id排个序吧
第五步,暂且就只传递int类型的,可是我一会是想按id>18的排序,一会是想按编号小于100的来排序,总不能按个要求就跑到这里来改代码吧。那么这是一个变化点,可不可以封装一下呢,让用户来传递呢,自然是可以的,依旧同上,OrderBy需要的是一个传入的是UserInfo类型,传出的是一个bool类型一个委托。我们将其提取出来,让其在方法参数那里传递过来就可以了。
public IQueryable<UserInfo> LoadPagesForInfos(int pageSize, int pageIndex, out int total,
Func<UserInfo, bool> whereFunc,Func<UserInfo,int> orderByFunc )
{
DataModelContainer db = new DataModelContainer();
total = db.UserInfo.Where(whereFunc).Count();
return
db.UserInfo.Where(whereFunc)
.OrderBy<UserInfo, int>(orderByFunc)//"<>"号是可以去掉的。这里同上面是不一样的。
.Skip(pageSize * (pageIndex - ))
.Take(pageSize)
.AsQueryable();
}
排序条件(仅限int类型)让用户传好不
第六步,传递的值的话可能是int类型,也有可能是其他的类型,让用户一直传int类型的不太合适吧。可不可以,让用户随便传递什么类型呢。比如时间(DateTime类型)来排序,自然可以,这样就需要用到泛型。泛型此处就不用类泛型,用方法泛型,使其职责单一,上面约束的是什么类型,下面就是什么类型。当我们对其约束之后,就是我们需要一个传入类型是UserInfo,传出的类型是T类型的一个委托了。依旧如上面的,我们将此委托当一个参数传递也就好了。就很好的做到了对此变化点的封装了。跟第五步对比,也就是将加了一个方法泛型和OrderBy()方法对返回值的约束改成了"T"就可以了。用户想按id来排序就传id相应的Lambda,想按DateTime来排序就传相应的Lambda就可以了。
public IQueryable<UserInfo> LoadPagesForInfos<T>(int pageSize, int pageIndex, out int total,
Func<UserInfo, bool> whereFunc, Func<UserInfo, T> orderByFunc)
{
DataModelContainer db = new DataModelContainer();
total = db.UserInfo.Where(whereFunc).Count();
return
db.UserInfo.Where(whereFunc)
.OrderBy<UserInfo, T>(orderByFunc)
.Skip(pageSize * (pageIndex - ))
.Take(pageIndex)
.AsQueryable();
}
想怎么排就怎么排
第七步,升序还是降序,排列。加个bool类型的isAsc的参数吧。小判断一下。
public IQueryable<UserInfo> LoadPagesForInfos<T>(int pageSize, int pageIndex, out int total,
Func<UserInfo, bool> whereFunc, Func<UserInfo, T> orderByFunc,bool isAsc)
{
DataModelContainer db = new DataModelContainer();
total = db.UserInfo.Where(whereFunc).Count();
if (isAsc)
{
return
db.UserInfo.Where(whereFunc)
.OrderBy<UserInfo, T>(orderByFunc)
.Skip(pageSize * (pageIndex - ))
.Take(pageIndex)
.AsQueryable();
}
else
{
return
db.UserInfo.Where(whereFunc)
.OrderByDescending<UserInfo, T>(orderByFunc)
.Skip(pageSize * (pageIndex - ))
.Take(pageIndex)
.AsQueryable();
}
}
升序还是降序
貌似就这样这个方法还不错的样子,附上一下完整方法的图片,喜欢这个字体,我将EF上下文的对象提到了最上面。

求指教,共同进步。
只是一个用EF写的一个简单的分页方法而已的更多相关文章
- cJSON: 一个用c写的一个简单好用的JSON解析器
转自:http://blog.csdn.net/chenzhongjing/article/details/9188347 下载地址: http://sourceforge.net/projects/ ...
- EF core Code First 简单的使用方法
好吧,我又回来了,其实一直都想写一篇关于EF core 的文章去记录自己在开发时候遇到的问题. 为什么要使用EF框架呢,因为原始的ADO.NET需要编写大量的数据访问代码,所以使用EF会更方便.但是今 ...
- 封装EF code first用存储过程的分页方法
一年半没有做过MVC的项目了,还是很怀念(因为现在项目还是原来的ASPX),个人还是喜欢mvc,最近又开始重拾MVC,感觉既熟悉又陌生. 记录一下封装好的分页代码 首先先说下 我使用EF codefi ...
- .NET 简单的扩展方法使用。
写代码时,我们经常会碰到dll中提供的方法,不够用或者不好用的情况.而且我们也不方便去更改dll本身的源码. 这时候我们可以使用.NET提供的"扩展方法"去解决这个问题. 下面我写 ...
- 8天掌握EF的Code First开发系列之动手写第一个Code First应用
返回<8天掌握EF的Code First开发>总目录 本篇目录 创建控制台项目 根据.Net中的类来创建数据库 简单的CRUD操作 数据库模式更改介绍 本章小结 自我测试 上一篇<8 ...
- 瞧一瞧,看一看呐,用MVC+EF快速弄出一个CRUD,一行代码都不用写,真的一行代码都不用写!!!!
瞧一瞧,看一看呐用MVC+EF快速弄出一个CRUD,一行代码都不用写,真的一行代码都不用写!!!! 现在要写的呢就是,用MVC和EF弄出一个CRUD四个页面和一个列表页面的一个快速DEMO,当然是在不 ...
- 实现一个最简单的VIM文本编辑器(可能有bug,随便写了一个)
简单的写了一个文本编辑器,功能很简单,但足以把文件IO相关的操作熟悉了,可能功能或者分配的大小还不够完善.请参考参考: #include <stdio.h> #include <co ...
- java————数组 简单写出一个管理系统
数组的特点 1, 数组是一块连续的空间,下标描述空间的位置. 2, 下标从0开始,最大下标为数组长度—1.(*.length-1) 3, 数组元素都是变量.(就是每个下标对应的内容).变量的类型 ...
- 写了一个简单的CGI Server
之前看过一些开源程序的源码,也略微知道些Apache的CGI处理程序架构,于是用了一周时间,用C写了一个简单的CGI Server,代码算上头文件,一共1200行左右,难度中等偏上,小伙伴可以仔细看看 ...
随机推荐
- C# 获取文件名及扩展名
C# 获取文件名及扩展名 string aFirstName = aFile.Substring(aFile.LastIndexOf("\\") + 1, (aFile.LastI ...
- JavaScript语言标识符和保留字
任何一种计算机语言都离不开标识符和保留字,下面我们将详细介绍JavaScript标识符和关键字.标识符 标识符就是给变量.函数和对象等指定的名字.构成标识符的字母是有一定的规范,JavaSc ...
- OC4_遵守多个协议
// // Calulator.h // OC4_遵守多个协议 // // Created by zhangxueming on 15/6/24. // Copyright (c) 2015年 zha ...
- eclipse不能更改设置tomcat 中的ServerLocation问题
当自己用eclipse写好了web项目后,也同时配置了服务器(tomcat6), 上面部署完毕后,直接访问http://localhost:8080 发现是 无法访问的,这是因为,Servers这里的 ...
- 2015年最新出炉的JavaScript开发框架
前端框架简化了开发过程中,像 Bootstrap 和 Foundation 就是前端框架的佼佼者.在这篇文章了,我们编制了一组新鲜的,实用的,可以帮助您建立高质量的 Web 应用程序的 JavaScr ...
- JS函数式编程【译】2.1 函数式编程语言
- [Guava源码分析]ImmutableCollection:不可变集合
摘要: 我的技术博客经常被流氓网站恶意爬取转载.请移步原文:http://www.cnblogs.com/hamhog/p/3888557.html,享受整齐的排版.有效的链接.正确的代码缩进.更好的 ...
- MVC5_学习笔记_1_CodeFirst
MVC5_EF6_1/* GitHub stylesheet for MarkdownPad (http://markdownpad.com) *//* Author: Nicolas Hery - ...
- unity打包android游戏部分问题总结
一:虚拟导航栏挡到游戏按钮: 解决方案如下: 1.获取焦点的时候隐藏 虚拟导航条 Navigation bar 隐藏导航条 2.出现导航条的时候,改变游戏界面大小 Unity tidbits: cha ...
- javascript Date 函数的坑
Javascrip中对日期的解析.格式化简直是混乱不堪,各种的坑,攻城狮们多小心. 1. 不要用 Date("yyyy-mm-dd") 构造函数解析字符串. IE.firefo ...