只是一个用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. 提高HTML5 Canvas性能的技巧

    详细内容请点击 一:使用缓存技术实现预绘制,减少重复绘制Canvs内容 很多时候我们在Canvas上绘制与更新,总是会保留一些不变的内容,对于这些内容 应该预先绘制缓存,而不是每次刷新. 直接绘制代码 ...

  2. html meta标签之http-equiv

    摘要:HTTP-EQUIV类似于HTTP的头部协议,它回应给浏览器一些有用的信息,以帮助正确和精确地显示网页内容.常用的HTTP-EQUIV类型有:Content-Type.Refresh .Expi ...

  3. C#中如何查找Dictionary中的重复值

    简介 在这篇帮助文档中,我将向你展示如何实现c#里字典中重复值的查找.你知道的对于一个老鸟来说,这是非常简单的代码.但是尽管如此,这也是一篇对c#初学者非常有用的帮助文档. 背景 多数程序员对小型数据 ...

  4. JavaScript学习笔记 - 进阶篇(2)- 数组

    什么是数组 我们知道变量用来存储数据,一个变量只能存储一个内容.假设你想存储10个人的姓名或者存储20个人的数学成绩,就需要10个或20个变量来存储,如果需要存储更多数据,那就会变的更麻烦.我们用数组 ...

  5. 转载:简单介绍Python中的try和finally和with方法

    用 Python 做一件很平常的事情: 打开文件, 逐行读入, 最后关掉文件; 进一步的需求是, 这也许是程序中一个可选的功能, 如果有任何问题, 比如文件无法打开, 或是读取出错, 那么在函数内需要 ...

  6. mysql 存储过程详解 存储过程

    mysql存储过程详解 1.      存储过程简介         我们常用的操作数据库语言SQL语句在执行的时候需要要先编译,然后执行,而存储过程(Stored Procedure)是一组为了完成 ...

  7. Codevs 2611 观光旅游

     时间限制: 1 s 空间限制: 128000 KB 题目等级:钻石   题目描述 Description 某旅游区里面有N个景点.两个景点之间可能直接有道路相连,用a[i][j]表示它的长度,否则它 ...

  8. POJ 1459(EK)

    这题是学着小媛学姐写的.. #include<cstdio> #include<cstring> #include<iostream> #include<qu ...

  9. UIScrollView,UIPageControl

    #import <UIKit/UIKit.h> @interface ViewController : UIViewController<UIScrollViewDelegate&g ...

  10. 在Linux中三种让crontab每秒执行任务的方法

    第一种方法: 1.创建脚本文件 cat phplog.sh 2.编辑脚本内容 #!/bin/bash while : ;do /home/scripts.sh 2>/dev/null & ...