EF分页

先来看看几个LINQ to SQL的几个函数。

Take

说明:获取集合的前n个元素;延迟。即只返回限定数量的结果集。

var q = (

    from e in db.Employees

    orderby e.HireDate

    select e)

    .Take(5);

语句描述:选择所雇用的前5个雇员。

Skip 

说明:跳过集合的前n个元素;延迟。即我们跳过给定的数目返回后面的结果集。

var q = (

    from p in db.Products

    orderby p.UnitPrice descending

    select p)

    .Skip (10);

语句描述:选择10种最贵产品之外的所有产品。

OrderBy
    适用场景:对查询出的语句进行排序,比如按时间排序 等等。
    说明:按指定表达式对集合排序;延迟,:按指定表达式对集合 排序;延迟,默认是升序,加上descending表示降序,对应的扩展方法是 OrderBy和OrderByDescending

下面这个例子使用 orderby 按雇用日期对雇员进行排序:
    var q =
    from e in db.Employees
    orderby e.HireDate
    select e;
    说明:默认为升序

看完这两个函数的使用方法,那么分页的思路也就很容易推出来了,若要显示第m页,每页n条数据,我们应该跳过n*(m-1)条数据,显示n条数据。

源码如下:

[csharp] view plain copy

  1. /// <summary>
  2. /// 分页查询 + 条件查询 + 排序
  3. /// </summary>
  4. /// <typeparam name="Tkey">泛型</typeparam>
  5. /// <param name="pageSize">每页大小</param>
  6. /// <param name="pageIndex">当前页码</param>
  7. /// <param name="total">总数量</param>
  8. /// <param name="whereLambda">查询条件</param>
  9. /// <param name="orderbyLambda">排序条件</param>
  10. /// <param name="isAsc">是否升序</param>
  11. /// <returns>IQueryable 泛型集合</returns>
  12. public IQueryable<T> LoadPageItems<Tkey>(int pageSize, int pageIndex, out int total, Expression<Func<T, bool>> whereLambda, Func<T, Tkey> orderbyLambda, bool isAsc)
  13. {
  14. total = MyBaseDbContext.Set<T>().Where(whereLambda).Count();
  15. if (isAsc)
  16. {
  17. var temp = MyBaseDbContext.Set<T>().Where(whereLambda)
  18. .OrderBy<T, Tkey>(orderbyLambda)
  19. .Skip(pageSize * (pageIndex - 1))
  20. .Take(pageSize);
  21. return temp.AsQueryable();
  22. }
  23. else
  24. {
  25. var temp = MyBaseDbContext.Set<T>().Where(whereLambda)
  26. .OrderByDescending<T, Tkey>(orderbyLambda)
  27. .Skip(pageSize * (pageIndex - 1))
  28. .Take(pageSize);
  29. return temp.AsQueryable();
  30. }
  31. }

使用示例

//查询要求:每页10条,显示第2页,查询性别为“男”,按年龄增序排列

int totalRecord;

List<Student>result = studentService.LoadItems(10,2,out totalRecord,u=>u.Sex==”男”,u=>u.Age,True);

时间: 2024-10-24 05:09:12

EF分页的相关文章

存储过程分页 Ado.Net分页 EF分页 满足90%以上

存储过程分页: 1 create proc PR_PagerDataByTop 2 @pageIndex int, 3 @pageSize int, 4 @count int out 5 as 6 select top(@pageSize) * from dbo.userInfo where ID not in 7 ( 8 select top((@pageIndex-1)*@pageSize) ID from dbo.userInfo 9 ) 10 set @count = (select C

EF分页中的陷阱

(一) 前言                                                                   EF使用非常简单,但是如果使用不当就会误入EF陷阱中.下面讲解了几种分页方式的对比,以及各种方式的缺陷. (二) 陷阱一   Expression<Func<T, TResult>> 和Func<T, TResult>的区别        说明:System.Linq.Expressions.Expression<Fun

EF 分页查询优化

按照通常的方式分页查询至少要查询数据两遍,一个操作是查询总数,另一个是查询数据,这样有些耗时 这里介绍一个基于EF的插件 EntityFramework.Extended,当然这个插件有很多的功能,比方说批量删除.批量修改.批量查询.缓存查询等 这里只介绍批量查询的方法 通过SQL Server Profilter监视生成的SQL代码,发现只连接了一次数据库,非常的厉害 不解释直接上代码 通用分页查询方法: 1 /// <summary> 2 /// 分页查询 3 /// </summa

关于EF分页查询报错(Count must have a non-negative value.)的解决方案

具体的异常信息如下,一开始没有写日志只看到错误信息:Count must have a non-negative value.,从表面意思可以看出来是Count值出现了负数,所以报错,查了半天的原因也没有看出来为什么,直到后面,我把Linq表达式输了出来,发现Skip(-10),我一想分页查询会根据页码跳过前面页码的记录数,所以会用Skip来跳过,但是这里的Skip数量为-10,这是为什么呢,我想了一下会不会是页码或者每页记录数有问题,于是我看了一下代码,果然发现没有给分页查询的PageInde

sql server 2008 中使用EF分页

InnerException = {System.Data.SqlClient.SqlException (0x80131904): 'OFFSET' 附近有语法错误.在 FETCH 语句中选项 NEXT 的用法无效.   在 System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)   在 System.Data

EF 分页

public class PageListDto<T> { public int Count { get; set; } public List<T> Data { get; set; } } public static PageListDto<T> GetPageList<T, S>(this IQueryable<T> source, int pageIndex, int pageSize, Expression<Func<T,

EF基本操作增、删、查、改、分页,join……等

一.批量添加数据 1 static void Main(string[] args) 2 { 3 add(); 4 add2(); 5 Console.ReadKey(); 6 } 7 8 static void add() 9 { 10 DemoDbEntities db = new DemoDbEntities(); 11 Stopwatch st = new Stopwatch(); 12 st.Start(); 13 for (int i = 0; i < 1000; i++) 14 {

EF增删查改基类

/// <summary> /// EF DAL CURD基类 /// </summary> /// <typeparam name="T"></typeparam> public class BaseDAL<T> where T : class, new() { /// <summary> /// 上下文网关 /// </summary> protected SchoolEntities db = n

FE+MVC分页

public ActionResult Create() { return View(); } [HttpPost] public ActionResult Create(Books book) { book.CreateDate = DateTime.Now; dbContext.Book.Add(book); var res = dbContext.SaveChanges(); if (res > 0) { //return Content("添加成功"); return R