Entity Framework分页扩展

Entity Framework分页在我初入门时总是困扰这我,无论是SQL分页还是Entity Framework的分页,总是显得那么麻烦,因此对于Entity Framework单独封装了分页。



一、分页原理

  对于分页本质是针对现有数据进行分段展示,如图:

  对于这12条数据属于筛选后的数据,针对筛选后的数据我们再进行分页,PageSize(每页数量),最后一页数量>0 && <PageSize则算一页。

二、分页设计(对于设计并不是很专业,马马虎虎) 

  

  最终我们通过PageListBase作为实现类,在通过扩展方法ExtensionIQueryable这个一个扩展类,针对IQueryable<T>进行扩展。

  

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Diagnostics;
 4 using System.IO;
 5 using System.Linq;
 6 using System.Linq.Expressions;
 7 using System.Runtime.Serialization;
 8 using System.Runtime.Serialization.Formatters.Binary;
 9 using System.Text;
10 using System.Threading.Tasks;
11
12 namespace Sunc.Framework.Repository.Entity.Extension
13 {
14     public static class ExtensionIQueryable
15     {
16         /// <summary>
17         /// 分页
18         /// </summary>
19         /// <param name="list"> 数据源 </param>
20         /// <param name="order"> 排序表达式 </param>
21         /// <param name="pageIndex"> 第几页 </param>
22         /// <param name="pageSize"> 每页记录数 </param>
23         /// <param name="count"> 记录总数 </param>
24         /// <returns></returns>
25         public static IQueryable<T> Pagination<T, TKey>(this IQueryable<T> list, Expression<Func<T, bool>> predicate, Expression<Func<T, TKey>> order, int pageIndex, int pageSize, out int count, bool isOrder = true)
26         {
27             try
28             {
29                 var source = list.Where(predicate.Compile()).AsQueryable();
30                 count = source.Count();
31                 if (isOrder)
32                     return source.OrderBy(order).Skip((pageIndex - 1) * pageSize).Take(pageSize);
33                 return source.OrderByDescending(order).Skip((pageIndex - 1) * pageSize).Take(pageSize);
34             }
35             catch (Exception ex)
36             {
37                 Console.WriteLine(ex.Message);
38                 Debug.WriteLine(ex.Message);
39                 count = 0;
40                 return new List<T>().AsQueryable();
41             }
42         }
43
44         public static V ToModel<T, V>(this T t) where T : ModelBase, V where V : ModelBase
45         {
46             return t;
47         }
48         public static string ToJson(this IQueryable<DatabaseModel> models)
49         {
50             return EntityBase.ToJson(models);
51         }
52
53     }
54 }

 三、最终实现

  1、我们使用Entity Framework应该知道懒加载

     public virtual DbSet<T_WindFarm> T_WindFarm { set; get; }

   我们在进行EF一系列表达式操作查询,数据实际并未查询,只用我们真正使用的时候才会执行查询。

  2、EF查询

    ItsmContext 扩展自 DbContext,多线程操作会存在诸多问题,因此我们采用单例模式

    

 1    private static object _asynContextLock = new object();
 2         private static ItsmContext _context;
 3         public static ItsmContext Context
 4         {
 5             get
 6             {
 7                 lock (_asynContextLock)
 8                 {
 9                     if (_context == null)
10                     {
11                         _context = new ItsmContext();
12                     }
13                     return _context;
14                 }
15             }
16         }

  3、实现类继承IBaseMethodPageList<Entity>

    

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Linq.Expressions;
 5 using System.Text;
 6 using System.Threading.Tasks;
 7 using Sunc.Framework.Repository.Entity;
 8
 9 namespace Sunc.Framework.Repository.Interface.BaseMethod
10 {
11     public interface IBaseMethodPageList<Entity>
12     {
13         IBaseEntityPageList<Entity> GetPageList(int pageIndex, int pageSize);
14
15
16         IBaseEntityPageList<Entity> GetPageList<TKey>(Expression<Func<Entity, bool>> predicate, Expression<Func<Entity, TKey>> order, int pageIndex, int pageSize, bool isOrder = true);
17     }
18 }

  实现类中实现方法

  

  a、using Sunc.Framework.Repository.Entity.Extension;是针对ExtensionIQueryable的引用;

  b、ItsmContext.Context.T_WindFarm.Pagination(predicate, order, pageIndex, pageSize, out count, true);我们通过筛选条件获取PageIndex即为当前页面IQueryable<T>实际结果集;

  c、 var pageList = new PageListBase<T_WindFarm>(models,pageIndex,pageSize,count);我们不用在关心如何去分页,只需要把结果集和总数传入即可;

  d、返回值为IBaseEntityPageList<T_WindFarm> 我们知道它继承于IBasePageList以及它的属性都为只读属性,因此我们可以防止数据被篡改。

4、最终结果

这样一来,我们不用考虑太多的分页问题

  A、ExtensionIQueryable -> Pagination方法帮助我们完成数据筛选得到实际的数据总数并将实际当前页数据、总数返回;

  B、PageListBase<T> 可以通过构造函数或者AddRange方法将当前页数据集加载,通过传入的count计算出实际页数。

具体的源码

Github:Sunc.Framework.Repository
IBasePageList Sunc.Framework.Repository.Interface
IBaseEntityPageList<Entity>  Sunc.Framework.Repository.Interface.BaseMethod
PageListBase<Entity> Sunc.Framework.Repository.Entity
ExtensionIQueryable Sunc.Framework.Repository.Entity.Extension
IBaseMethodPageList<Entity> Sunc.Framework.Repository.Interface.BaseMethod

--分享源于热爱

Sunc

原文地址:https://www.cnblogs.com/umeall/p/9006731.html

时间: 2024-11-05 16:04:53

Entity Framework分页扩展的相关文章

Entity Framework 分页处理

在SQL中进行分页,网上已经有很多例子了,在这里我使用Linq to SQL让C#来生成分页代码,首先创建分页的扩展方法: public static class Extensions { /// <summary> /// 分页 /// </summary> /// <param name="list"> 数据源 </param> /// <param name="page"> 第几页 </para

采用EntityFramework.Extended 对EF进行扩展(Entity Framework 延伸系列2)

前言 Entity Framework 延伸系列目录 今天我们来讲讲EntityFramework.Extended 首先科普一下这个EntityFramework.Extended是什么,如下: 这是一个对Entity Framework进行扩展的类库. 完全支持EF 5.0/6.0+, GitHub地址 https://github.com/loresoft/EntityFramework.Extended, 最后一次更新是在2015/07/10 这个库支持批量更新,删除.查询结果缓存和审计

EF3:Entity Framework三种开发模式实现数据访问

前言 Entity Framework支持Database First.Model First和Code Only三种开发模式,各模式的开发流程大相径庭,开发体验完全不一样.三种开发模式各有优缺点,对于程序员没有哪种模式最好,只有哪种模式更适合.接下来我将分别使用这三种开发模式实现同一数据库模型的数据持久化功能.希望通过实践能帮助你找到更适合你的开发模式 Database First Database First开发模式指以数据库设计为基础,并根据数据库自动生成实体数据模型,从而驱动整个开发流程

Entity Framework后台采用分页方式取数据与AspNetPager控件的使用

转载至:http://www.cnblogs.com/jaxu/p/3655582.html 本文是一个对AspNetPager控件使用的笔记! 有关AspNetPager控件可以查看杨涛主页.这是一个开放的自定义ASP.NET控件,支持各种自定义的数据分页方式,使用很方便,而且功能也很强大,网站开发过程中使用该控件可以省去很多不必要的麻烦. 本页下载:AspNetPager745DLL.zip 然后看一下在页面上如何通过Entity Framework将分页数据传递给该控件以实现真分页. 页面

MVC5 Entity Framework学习之添加排序、筛选和分页功能

前一篇文章中实现了对Student 实体的的基本CRUD操作,在这篇文章中将演示如何为Students Index页面添加排序.筛选和分页的功能. 下面是当完成排序.筛选和分页功能后的截图,你可以点击列标题来进行排序. 1.为 Students Index页面添加列排序链接 要为Students Index页面添加排序功能,你需要修改Student controller的Index方法,并为Student Index视图添加代码. 向Index方法添加排序功能 打开Controllers\Stu

Entity Framework DbSet&lt;T&gt;之Include方法与IQueryable&lt;T&gt;扩展方法Include的使用

Entity Framework使用Code First方式时,实体之间已经配置好关系,根据实际情况某些情况下需要同时获取导航属性,比如获取商品的同时需要获取分类属性(导航属性),或者基于优化方面考虑等,下面来看一个例子 例子中有会员实体类(Member)与角色实体类(Role),Role与Member的关系是1:n,控制台应用程序代码如下: using System; using System.Collections.Generic; using System.Linq; using Syst

entity framework 新手入门篇(3)-entity framework实现orderby,count,groupby,like,in,分页等

前面我们已经学习了entityframework的基本的增删改查,今天,我们将在EF中实现一些更加贴近于实际功能的SQL方法. 承接上面的部分,我们有一个叫做House的数据库,其中包含house表和seller表. 在本次学习之前,我们先要了解一个神奇的接口,iqueryable这个接口类似于ienumable,但并不完全相同,Iqueryable是可查询类型需要实现的最重要的接口,在其Count,ToList,ToArray之后才会真正执行查询,所以,为了保证性能,请尽量在最后一步在进行Co

Entity Framework 多条件排序与分页的实现

项目过程中遇到需要对数据源进行多条件排序的情况, 开始觉得很简单,分分钟搞定,当时的逻辑大概是将排序条件以及是否倒序写入Dictionary中,在方法中遍历此Dictionary进行排序(下面的方法附带了分页,其实觉得耦合度太高,感觉还是都分开比较好) public IQueryable<T> GetListByPage<S>(int pageSize, int pageIndex, out int pageCount, Expression<Func<T, bool&

基于Entity Framework的自定义分页,增删改的通用实现

简介 之前写个一个基于Dapper的分页实现,现在再来写一个基于Entity Framework的分页实现,以及增删改的通用实现. 代码 还是先上代码:https://github.com/jinweijie/EF.GenericRepository 如何运行示例 还是像先前一样: 1. 先Clone下代码,在Database里面解压缩Database.7z 2. Attach到Sql Server LocalDB上.如果你用的不是Sql Server的LocalDB,你需要更改App.Conf