Entity Framework自定义分页效果的实现教程
这篇文章主要为大家详细介绍了基于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.Config里的连接字符串。
3. Ctrl + F5,运行示例程序。
Repository 基类 - 查询
Common\AbstractRepository.cs 是Repository的基类,实现了增删改查的一些方法,例如:
public virtual Tuple<IEnumerable<T>, int> Find(Expression<Func<T, bool>> criteria , int pageIndex , int pageSize , string[] asc , string[] desc , params Expression<Func<T, object>>[] includeProperties)
这个方法是AbstractRepository查询方法中的一个,用于自定义分页查询,其中criteria 为一个表达式,作为查询的条件,参数pageIndex, pageSize, asc, desc为分页相关参数;
关于多表(关联表):
includeProperties为在多表时候,Join相关联的表。因为EF默认是Lazy Loading,相关联的表默认不是立即加载的,所以有时候如果写代码不小心,在for循环里就有可能会循环查询n个字表。用来includeProperties参数,就可以在查询时候join关联表。
Repository 基类 - 增删改
AbstractRepository已经用泛型实现了增删改方法:
public virtual T Create(T entity)
public virtual T Update(T entity)
public virtual T CreateOrUpdate(T entity)
public virtual void Delete(TId id)
另外,关于transaction的实现,我使用了Unit of Work模式,多个Repository共享一个DBContext,关于UOW,请在Common\UnitOfWork.cs里找到。
调用UOW的时候,基本类似于这样:
var uow = new EFUnitOfWork(); var repo = uow.GetLogRepository(); repo.Create(new Log { LevelId = 1, Thread = "", Location = "Manual Creation", Message = "This is manually created log.", CreateTime = DateTimeOffset.Now, Date = DateTime.Now }); uow.Commit();
从UnitOfWork里得到一个或多个Repository,共享DBContext,做增删改操作,最后uow统一SaveChanges。
Repository的派生类
由于已经有了AbstractRepository,实现了增删改查的很多方法,所以派生类,例如示例项目里的LogRepository基本就可以变得很简单,主要实现一些特定的业务逻辑,在示例项目里,因为没有特殊的业务逻辑,所以会很简单:
public class LogRepository : AbstractRepository<Log, int> { public LogRepository(EFContext context) : base(context) { } }
关于Entity的生成
本人比较喜欢Database First 实现,先设计数据库,然后用edmx reverse engineering,生成POCO。可以参考Entity目录下的相关文件。
当然,如果你喜欢Code First,同样没有问题,仍然适用本文的实现。
使用Logging日志追踪EF SQL
在使用Entity Framework的时候,最好关心一下EF所生成的SQL,这样可以在开发阶段发现一些潜在的性能问题,避免在生产环境焦头烂额:)
在Common\EFContext.cs 里,有一个配置项EnableTraceSql,如果为true,那么所以EF生成的SQL将会被nlog记录下来。我将nlog的日志配置到了数据库。也就是说,在你运行示例项目时,每次查询,都会增加新的日志记录,内容为查询时生成的SQL:
Specification Pattern
在查询方法里,有个重载是接受一个ISpecification示例,这样的实现可以有效的控制业务逻辑,对于写给被其他人调用的接口来说,可以明确的确定查询参数,例如:
public class LogSearchSpecification : ISpecification<Log> { public string LevelName { get; set; } public string Message { get; set; } public Expression<Func<Log, bool>> ToExpression() { return log => (log.Level.Name == LevelName || LevelName == "") && (log.Message.Contains(Message) || Message == ""); } public bool IsSatisfiedBy(Log entity) { return (entity.Level.Name == LevelName || LevelName == "") && (entity.Message.Contains(Message) || Message == ""); } }
那么,调用这个查询方法的代码就可以明确知道,我的查询条件为LevelName和Message,至于LevelName是等于以及Message为Like则是在LogSearchSpeficiation里实现,做到很好的封装。
以上是Entity Framework自定义分页效果的实现教程的详细内容。更多信息请关注PHP中文网其他相关文章!

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

热门话题

Netflix上的头像是你流媒体身份的可视化代表。用户可以超越默认的头像来展示自己的个性。继续阅读这篇文章,了解如何在Netflix应用程序中设置自定义个人资料图片。如何在Netflix中快速设置自定义头像在Netflix中,没有内置功能来设置个人资料图片。不过,您可以通过在浏览器上安装Netflix扩展来实现此目的。首先,在浏览器上安装Netflix扩展的自定义个人资料图片。你可以在Chrome商店买到它。安装扩展后,在浏览器上打开Netflix并登录您的帐户。导航至右上角的个人资料,然后单击

.NETFramework4是开发人员和最终用户在Windows上运行最新版本的应用程序所必需的。但是,在下载安装.NETFramework4时,许多用户抱怨安装程序在中途停止,显示以下错误消息-“ .NETFramework4hasnotbeeninstalledbecauseDownloadfailedwitherrorcode0x800c0006 ”。在您的设备上安装.NETFramework4时,如果您也在体验它,那么您就来对了地方

Win11如何自定义背景图片?在最新发布的win11系统中,里面有许多的自定义功能,但是很多小伙伴不知道应该如何使用这些功能。就有小伙伴觉得背景图片比较单调,想要自定义背景图,但是不知道如何操作自定义背景图,如果你不知道如何定义背景图片,小编下面整理了Win11自定义背景图片步骤,感兴趣的话一起往下看看把!Win11自定义背景图片步骤1、点击桌面win按钮,在弹出的菜单中点击设置,如图所示。2、进入设置菜单,点击个性化,如图所示。3、进入个性化,点击背景,如图所示。4、进入背景设置,点击浏览图片

每当您的Windows11或Windows10PC出现升级或更新问题时,您通常会看到一个错误代码,指示故障背后的实际原因。但是,有时,升级或更新失败可能不会显示错误代码,这时就会出现混淆。有了方便的错误代码,您就可以确切地知道问题出在哪里,因此您可以尝试修复。但是由于没有出现错误代码,因此识别问题并解决它变得极具挑战性。这会占用您大量时间来简单地找出错误背后的原因。在这种情况下,您可以尝试使用Microsoft提供的名为SetupDiag的专用工具,该工具可帮助您轻松识别错误背后的真

维恩图是用来表示集合之间关系的图。要创建维恩图,我们将使用matplotlib。Matplotlib是一个在Python中常用的数据可视化库,用于创建交互式的图表和图形。它也用于制作交互式的图像和图表。Matplotlib提供了许多函数来自定义图表和图形。在本教程中,我们将举例说明三个示例来自定义Venn图。Example的中文翻译为:示例这是一个创建两个维恩图交集的简单示例;首先,我们导入了必要的库并导入了venns。然后我们将数据集创建为Python集,之后,我们使用“venn2()”函数创

Vue是一款流行的JavaScript框架,它提供了许多方便的功能和API以帮助开发者构建交互式的前端应用程序。随着Vue3的发布,render函数成为了一个重要的更新。本文将介绍Vue3中render函数的概念、用途和如何使用它自定义渲染函数。什么是render函数在Vue中,template是最常用的渲染方式,但是在Vue3中,可以使用另外一种方式:r

适用于iPhone的iOS17更新为AppleMusic带来了一些重大变化。这包括在播放列表中与其他用户协作,在使用CarPlay时从不同设备启动音乐播放等。这些新功能之一是能够在AppleMusic中使用交叉淡入淡出。这将允许您在曲目之间无缝过渡,这在收听多个曲目时是一个很棒的功能。交叉淡入淡出有助于改善整体聆听体验,确保您在音轨更改时不会受到惊吓或退出体验。因此,如果您想充分利用这项新功能,以下是在iPhone上使用它的方法。如何為AppleMusic啟用和自定Crossfade您需要最新的

CakePHP是一个强大的PHP框架,为开发人员提供了很多有用的工具和功能。其中之一是分页,它可以帮助我们将大量数据分成几页,从而简化浏览和操作。默认情况下,CakePHP提供了一些基本的分页方法,但有时你可能需要创建一些自定义的分页方法。这篇文章将向您展示如何在CakePHP中创建自定义分页。步骤1:创建自定义分页类首先,我们需要创建一个自定义分页类。这个
