只是一个用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. MongoDB - The mongo Shell, Access the mongo Shell Help

    In addition to the documentation in the MongoDB Manual, the mongo shell provides some additional inf ...

  2. 【CSS3】---为边框应用图片 border-image

    为边框应用图片 border-image 顾名思义就是为边框应用背景图片,它和我们常用的background属性比较相似.例如: background:url(xx.jpg) 10px 20px no ...

  3. [转载]JSON序列化与反序列化

    转载:http://www.cnblogs.com/ejiyuan/archive/2010/04/09/1708084.html 方法一:引入System.Web.Script.Serializat ...

  4. 通过SQL ID查询SQL Text

    SELECT SQL_ID, SQL_TEXT,FIRST_LOAD_TIME, EXECUTIONS FROM V$SQLAREA where SQL_ID='22v8fyk0juw25';

  5. Objective-C排序算法实现

    算法作为程序猿的一种基本技能,对我来说却一直是一个硬伤.毕竟平时的工作接触算法的地方很少,大部分时间都是在搭建UI,写业务逻辑,写网络请求.然而在面试当中,算法往往又是考察的重点. 也许你会说这些平时 ...

  6. Qt 5 在Windows下 出现QApplication: No such file or directory 问题的解决办法

    解决方法是:在*.pro工程项目文件中添加一行QT += widgets,然后再编译运行就OK了.

  7. AD查询1000条限制和解决方案

      公司的一个项目要从AD上取数据,为了测试性能,批量在AD上创建了2000多个用户.但是用java程序获取所有用户的时候会报错或者只能取到1000条数据.   条数据. 用org.springfra ...

  8. [windows phone开发]新生助手的开发过程与体会三

    由于网络原因,新生助手开发介绍的博客近期一直没有更新,请大家见谅.今天向大家介绍一下新生助手中动态磁帖的实现. 在PhoneApplicationPage中添加如下引用 xmlns:toolkit=& ...

  9. Microsoft.Xna.Framework.TitleContainer.OpenStream()

    /// <summary> /// This method opens a file using System.IO classes and the /// TitleLocation p ...

  10. 如何在Ubuntu下使用TF/SD 卡制作Exynos 4412 u-boot启动盘

    /** ****************************************************************************** * @author    Maox ...