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控件,支持各种自定义的数据分页方式,使用很方便,而且功能也很强大, ...
随机推荐
- 利用openssl管理证书及SSL编程第3部分:将MinGW编译的openssl dll导出def和lib供MSVC使用
将MinGW编译的openssl dll导出def和lib供MSVC使用 前面我们用mingw把openssl 编译成了动态库,得到下面2个dll文件: libeay32.dll ssleay32.d ...
- UNIX环境高级编程——创建与打开IPC通道
创建或打开一个IPC对象的三个getXXX函数的第一个参数key是类型为key_t的IPC键,返回值identifier是一个整数标识符.该标识符不同于ftok函数的id参数.对于key值,应用程序有 ...
- cocos2D v3.4 在TileMap中开启高清显示
在Tiled中制作一幅地图,用的图片砖块分辨率为32x32. iOS设备为iPhone 4s. 在未打开高清屏支持的cocos2d v2.x版本中,运行log显示480x320.遂启用高清屏支持: [ ...
- 【一天一道LeetCode】#130. Surrounded Regions
一天一道LeetCode 本系列文章已全部上传至我的github,地址:ZeeCoder's Github 欢迎大家关注我的新浪微博,我的新浪微博 欢迎转载,转载请注明出处 (一)题目 Given a ...
- 看到个有趣的方法批量下载rtf模板
一般想要批量下载rtf模板我们都是用fndload来实现或者 perl download.pl来实现,今天看到一个比较有趣的方法 Hi, Blob column 'template file data ...
- 一键安装LAMP
一键安装LAMP LAMP是Linux,Apache,MySQL和PHP合起来的简称,用于开发网站.对于初学者而言,没有什么比一键部署一个LAMP开发环境更省心的了,到下面的网址下载BitNami: ...
- 基于Qt的手机程序----口袋理财
主页面 记账模块 制定目标 备忘录
- MySQL学习笔记_8_SQL语言基础复习
SQL语言基础复习 一.概述 SQL语句注释方式 1)以"#"开头直到行尾的所有内容都是注释 2)以"--"(--后还有一个空格)开头直到行尾的所有内容都是注释 ...
- 网易内推(Android) 拿offer
学校BBS上师兄发网易内推,凑下热闹投了一发 一面:电话面 大概25分钟,感觉面试官气场很足,主要关注了其中一个 个人开源项目 1.自我介绍 2.说说你做的这个项目 当时谈到使用到了开源框架xtuil ...
- JavaScript进阶(七)JS截取字符串substr 和 substring方法的区别
JS截取字符串substr 和 substring方法的区别 substr方法 返回一个从指定位置开始的指定长度的子字符串. stringvar.substr(start [, length ]) 参 ...