只是一个用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. js完美解决IE6不支持position:fixed的bug

    详细内容请点击 <!DOCTYPE html><html><head><meta http-equiv="Content-Type" co ...

  2. Quartz.net官方开发指南系列篇

    Quartz.NET是一个开源的作业调度框架,是OpenSymphony 的 Quartz API的.NET移植,它用C#写成,可用于winform和asp.net应用中.它提供了巨大的灵活性而不牺牲 ...

  3. SQL Server高级内容之case语法函数

    1.Case函数的用法  (1)使用类似:switch-case与if-else if. (2)语法: case [字段] when 表达式 then 显示数据 when 表达式 then 显示数据 ...

  4. 常用的CSS缩写语法一些方法小结

    使用缩写可以帮助减少你CSS文件的大小,更加容易阅读.css缩写的主要规则如下: 颜色 16进制的色彩值,如果每两位的值相同,可以缩写一半,例如: #000000可以缩写为#000;#336699可以 ...

  5. 6步图文教你优化myeclipse2014

    MyEclipse 2014优化速度方案仍然主要有这么几个方面:去除无需加载的模块.取消冗余的配置.去除不必要的检查.关闭更新. 第一步: 去除不需要加载的模块 一个系统20%的功能往往能够满足80% ...

  6. 【学习笔记】【C语言】变量

    1. 什么是变量 当一个数据的值需要经常改变或者不确定时,就应该用变量来表示.比如游戏积分. 2. 定义变量 1> 目的 任何变量在使用之前,必须先进行定义. 定义变量的目的是:在内存中分配一块 ...

  7. Ubuntu上OpenStack DashBoard主题修改的方案

    最近终于把OpenStack的整个初步环境安装部署并配置成功,后续工作就是安装一些可选项了,如Cinder.Swift部件了.我们的整个项目采用的颜色方案主要为清淡色系,蓝色为主,可OpenStack ...

  8. 10款很酷的HTML5动画和实用应用 有源码

    10款很酷的HTML5动画和实用应用,这里有菜单.SVG动画.Loading动画,总有你喜欢的,而且,每一款HTML5应用都提供源代码下载,方便大家学习和研究,一起来看看吧. 1.HTML5 SVG ...

  9. debian终端菱形乱码修复

    最简安装debian的时候由于没有中文字库,若选择看中文环境会出现菱形乱码.先把zh.utf8换为us.utf8看着好顺眼些.按空格键取消已选的zh.utf8选项按空格键选择us.utf8选项ok

  10. ABAP OO与ALV结合方式探索(2)

    接上篇 一开始设计的BO 类是为了实现功能而实现功能 从类的单一职责的角度而言 先把这个BO对象拆分   这里又有一个需要考虑的点:   如何传递内表数据到ALV 如果引入一个中间变量,数据就会被do ...