只是一个用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写的一个简单的分页方法而已的更多相关文章

  1. cJSON: 一个用c写的一个简单好用的JSON解析器

    转自:http://blog.csdn.net/chenzhongjing/article/details/9188347 下载地址: http://sourceforge.net/projects/ ...

  2. EF core Code First 简单的使用方法

    好吧,我又回来了,其实一直都想写一篇关于EF core 的文章去记录自己在开发时候遇到的问题. 为什么要使用EF框架呢,因为原始的ADO.NET需要编写大量的数据访问代码,所以使用EF会更方便.但是今 ...

  3. 封装EF code first用存储过程的分页方法

    一年半没有做过MVC的项目了,还是很怀念(因为现在项目还是原来的ASPX),个人还是喜欢mvc,最近又开始重拾MVC,感觉既熟悉又陌生. 记录一下封装好的分页代码 首先先说下 我使用EF codefi ...

  4. .NET 简单的扩展方法使用。

    写代码时,我们经常会碰到dll中提供的方法,不够用或者不好用的情况.而且我们也不方便去更改dll本身的源码. 这时候我们可以使用.NET提供的"扩展方法"去解决这个问题. 下面我写 ...

  5. 8天掌握EF的Code First开发系列之动手写第一个Code First应用

    返回<8天掌握EF的Code First开发>总目录 本篇目录 创建控制台项目 根据.Net中的类来创建数据库 简单的CRUD操作 数据库模式更改介绍 本章小结 自我测试 上一篇<8 ...

  6. 瞧一瞧,看一看呐,用MVC+EF快速弄出一个CRUD,一行代码都不用写,真的一行代码都不用写!!!!

    瞧一瞧,看一看呐用MVC+EF快速弄出一个CRUD,一行代码都不用写,真的一行代码都不用写!!!! 现在要写的呢就是,用MVC和EF弄出一个CRUD四个页面和一个列表页面的一个快速DEMO,当然是在不 ...

  7. 实现一个最简单的VIM文本编辑器(可能有bug,随便写了一个)

    简单的写了一个文本编辑器,功能很简单,但足以把文件IO相关的操作熟悉了,可能功能或者分配的大小还不够完善.请参考参考: #include <stdio.h> #include <co ...

  8. java————数组 简单写出一个管理系统

    数组的特点 1,  数组是一块连续的空间,下标描述空间的位置. 2,  下标从0开始,最大下标为数组长度—1.(*.length-1) 3,  数组元素都是变量.(就是每个下标对应的内容).变量的类型 ...

  9. 写了一个简单的CGI Server

    之前看过一些开源程序的源码,也略微知道些Apache的CGI处理程序架构,于是用了一周时间,用C写了一个简单的CGI Server,代码算上头文件,一共1200行左右,难度中等偏上,小伙伴可以仔细看看 ...

随机推荐

  1. mvc路由规则相关

    1,可以创建多条路由规则,每条路由规则的name属性不能相同 2,路由规则是有顺序的,如果被前面的规则匹配了,那么后面的规则就没有机会了 下面是一条路由规则的代码 routes.MapRoute( n ...

  2. JQuery之append和appendTo的区别,还有js中的appendChild用法

    JQuery之append和appendTo的区别 append()前面是要选择的对象,后面是要在对象内插入的元素内容 appendTo()前面是要插入的元素内容且为Jquery对象,而后面是要选择的 ...

  3. UINavigationController与UITabbarController的样式

    之前虽然也手写过这两中视图控制器,但是更多的还是使用SB来创建,最近发现了一些问题,现在总结一下. 1.改变UINavigationBar的颜色 在UINavigationController中,之前 ...

  4. 上传至应用商店以及testflight相关。

    对于一个新的开发者账号来说,首先你需要创建一个新的发布证书.这个证书只要创建一次就行了,如果以后用的话,直接拿过来用就行了,当然发布证书是和配置文件一起使用的,还有就是关于p12,就是用创建证书的电脑 ...

  5. 20141113--SQL 事务

    ---------------------触发器----------------------------- --触发器本质上还是一个存储过程,trigger --只不过不是通过exec调用执行,而是通 ...

  6. [Bootstrap]组件(三)

    输入框组 添加额外元素.input-group-addon 外包元素.input-group>input-group-addon+form-control <div class=" ...

  7. 10款强大的jQuery/HTML5应用新鲜出炉

    1.CSS3/jQuery自定义弹出窗口 多种弹出动画 这是一款利用jQuery和CSS3实现的自定义弹出窗口,这可比浏览器默认的弹出窗口漂亮多了.弹出窗口中可以自定义html,十分灵活.另外最重要的 ...

  8. 解决Eclipse中Java工程间循环引用而报错的问题

    如果myeclipse  报如下错误 A cycle was detected in the build path of project 如果我们的项目包含多个工程(project),而它们之间又是循 ...

  9. 【风马一族_Python】 实施kNN算法

    一.在PyCharm 5.0.4(编写python程序的IDE) 编写kNN.py文件的代码 -------------------------- 1. kNN.py  运算符模块 --------- ...

  10. 编译安装HTTPD 2.4.9版本

    编译安装HTTPD 2.4.9版本    服务脚本:/etc/rc.d/init.d/httpd    脚本配置文件路径:/etc/sysconfig/httpd    运行目录:/etc/httpd ...