Entity Framework分页扩展
Entity Framework分页在我初入门时总是困扰这我,无论是SQL分页还是Entity Framework的分页,总是显得那么麻烦,因此对于Entity Framework单独封装了分页。
一、分页原理
对于分页本质是针对现有数据进行分段展示,如图:

对于这12条数据属于筛选后的数据,针对筛选后的数据我们再进行分页,PageSize(每页数量),最后一页数量>0 && <PageSize则算一页。
二、分页设计(对于设计并不是很专业,马马虎虎)
  
最终我们通过PageListBase作为实现类,在通过扩展方法ExtensionIQueryable这个一个扩展类,针对IQueryable<T>进行扩展。
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Linq.Expressions;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;
using System.Text;
using System.Threading.Tasks; namespace Sunc.Framework.Repository.Entity.Extension
{
public static class ExtensionIQueryable
{
/// <summary>
/// 分页
/// </summary>
/// <param name="list"> 数据源 </param>
/// <param name="order"> 排序表达式 </param>
/// <param name="pageIndex"> 第几页 </param>
/// <param name="pageSize"> 每页记录数 </param>
/// <param name="count"> 记录总数 </param>
/// <returns></returns>
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)
{
try
{
var source = list.Where(predicate.Compile()).AsQueryable();
count = source.Count();
if (isOrder)
return source.OrderBy(order).Skip((pageIndex - ) * pageSize).Take(pageSize);
return source.OrderByDescending(order).Skip((pageIndex - ) * pageSize).Take(pageSize);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
Debug.WriteLine(ex.Message);
count = ;
return new List<T>().AsQueryable();
}
} public static V ToModel<T, V>(this T t) where T : ModelBase, V where V : ModelBase
{
return t;
}
public static string ToJson(this IQueryable<DatabaseModel> models)
{
return EntityBase.ToJson(models);
} }
}
三、最终实现
1、我们使用Entity Framework应该知道懒加载
public virtual DbSet<T_WindFarm> T_WindFarm { set; get; }
我们在进行EF一系列表达式操作查询,数据实际并未查询,只用我们真正使用的时候才会执行查询。
2、EF查询
ItsmContext 扩展自 DbContext,多线程操作会存在诸多问题,因此我们采用单例模式
private static object _asynContextLock = new object();
private static ItsmContext _context;
public static ItsmContext Context
{
get
{
lock (_asynContextLock)
{
if (_context == null)
{
_context = new ItsmContext();
}
return _context;
}
}
}
3、实现类继承IBaseMethodPageList<Entity>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Text;
using System.Threading.Tasks;
using Sunc.Framework.Repository.Entity; namespace Sunc.Framework.Repository.Interface.BaseMethod
{
public interface IBaseMethodPageList<Entity>
{
IBaseEntityPageList<Entity> GetPageList(int pageIndex, int pageSize); IBaseEntityPageList<Entity> GetPageList<TKey>(Expression<Func<Entity, bool>> predicate, Expression<Func<Entity, TKey>> order, int pageIndex, int pageSize, bool isOrder = true);
}
}
实现类中实现方法
  
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计算出实际页数。
具体的源码
| 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
Entity Framework分页扩展的更多相关文章
- Entity Framework的扩展库
		
https://github.com/jcachat/EntityFramework.DynamicFilters Provides global & scoped filters for E ...
 - Entity Framework 分页处理
		
在SQL中进行分页,网上已经有很多例子了,在这里我使用Linq to SQL让C#来生成分页代码,首先创建分页的扩展方法: public static class Extensions { /// & ...
 - 采用EntityFramework.Extended 对EF进行扩展(Entity Framework 延伸系列2)
		
前言 Entity Framework 延伸系列目录 今天我们来讲讲EntityFramework.Extended 首先科普一下这个EntityFramework.Extended是什么,如下: 这 ...
 - 《ASP.NET MVC4 WEB编程》学习笔记------Entity Framework的Database First、Model First和Code Only三种开发模式
		
作者:张博出处:http://yilin.cnblogs.com Entity Framework支持Database First.Model First和Code Only三种开发模式,各模式的开发 ...
 - Entity Framework技术系列之0:开篇
		
小分享:我有几张阿里云优惠券,用券购买或者升级阿里云相应产品最多可以优惠五折!领券地址:https://promotion.aliyun.com/ntms/act/ambassador/shareto ...
 - EF3:Entity Framework三种开发模式实现数据访问
		
前言 Entity Framework支持Database First.Model First和Code Only三种开发模式,各模式的开发流程大相径庭,开发体验完全不一样.三种开发模式各有优缺点,对 ...
 - Entity Framework:三种开发模式实现数据访问
		
原文地址 http://blog.csdn.net/syaguang2006/article/details/19606715 前言 Entity Framework支持Database First. ...
 - 《Entity Framework 6 Recipes》中文翻译系列 (17) -----第三章 查询之分页、过滤和使用DateTime中的日期部分分组
		
翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 3-12 分页和过滤 问题 你想使用分页和过滤来创建查询. 解决方案 假设你有如图3 ...
 - Entity Framework后台采用分页方式取数据与AspNetPager控件的使用
		
本文是一个对AspNetPager控件使用的笔记! 有关AspNetPager控件可以查看杨涛主页.这是一个开放的自定义ASP.NET控件,支持各种自定义的数据分页方式,使用很方便,而且功能也很强大, ...
 
随机推荐
- Java-IO之总框架
			
在Java IO中我们会经常提到输入流和输出流,流是一种抽象的数据总称,本质是能够进行数据的传输.按照流的方向分为:输入流和输出流.按照流中处理数据的单位,可以将其区分为:字节流和字符流.在Java中 ...
 - EBS DBA指南笔记(一)
			
第一章 ORACLE APPLICATIONS 的组件与架构 1.ebs组件的几大构成:客户端,form server,web server,concurrent processor,数据库.每个组 ...
 - Mybatis插件原理分析(三)分页插件
			
在Mybatis中插件最经常使用的是作为分页插件,接下来我们通过实现Interceptor来完成一个分页插件. 虽然Mybatis也提供了分页操作,通过在sqlSession的接口函数中设置RowBo ...
 - Ajax分页 Spring MVC + Hibernate
			
效果图: 1. 添加公共类.方法.代码 1. 分页类:Page.java package cn.com.aperfect.sso.base.dao; import java.util.Arra ...
 - gitlab6 配置的几个问题说明
			
gitlab6 配置的几个问题说明 按照gitlab的网站的详细步骤,终于把gitlab 6.1 stable安装到2台虚拟机上了.由于gitlab6运行于虚拟机上,所以配置这个虚拟机的hostnam ...
 - DB 查询分析器 6.04 发布 ,本人为之撰写的相关技术文章达78篇
			
DB查询分析器 6.04 发布,本人为之撰写的相关技术文章达78篇 中国本土程序员马根峰(CSDN专访马根峰:海量数据处理与分析大师的中国本土程序员 http://www.csdn.net/artic ...
 - FFmpeg在ubuntu下安装及使用
			
FFmpeg是一套可以用来记录.转换数字音频.视频,并能将其转化为流的开源计算机程序.采用LGPL或GPL许可证.它提供了录制.转换以及流化音视频的完整解决方案.它包含了非常先进的音频/视频编解码库l ...
 - H5学习之旅-H5的框架(13)
			
H5框架语法介绍 :frame:框架对于页面的设计有很大的作用 frameSet:框架集标签定义如何将窗口分割为框架 ,每一个frameset定义一些列行或者列,rowS/COLS规定了每行或者每列占 ...
 - JS跨域请求
			
前提:两个项目,第一个项目想请求第二个项目不通过服务器代码只通过页面请求. 1. 第一个项目html(需要第二个项目配合实现) 1 2 3 4 5 6 7 <script> functio ...
 - Erlang 编写 Kafka 客户端之最简单入门
			
Erlang 编写 Kafka 客户端之最简单入门 费劲周折,终于测通了 erlang 向kafka 发送消息,使用了ekaf 库,参考: An advanced but simple to use, ...