framework源码中常用的设计模式(推荐一个EntityFramework扩展开源项目)
对于C#程序员来说,EF可以说是又爱又恨,EF框架简洁的Linq to sql可以说是大大的提高开发人员的工作效率,不需要写复杂的SQL语句。但EF的性能问题一直以来经常被人所吐槽,究其原因在于“复杂的操作在生成SQL阶段耗时长,且执行效率不高”。
但并不是没有办法解决,今天给大家推荐一个EF第三方扩展库,可以很好的解决此问题。
项目简介这是由zzzproject组织出品,EF第三方库,通过必备功能扩展了DbContext:包括过滤器,缓存,提前查询,批量操作等EF扩展功能。
该项目一直在迭代升级,支持最新版本EF 6、EF Core。
项目结构使用方法
批量删除
// using Z.EntityFramework.Plus; // Don't forget to include this.
// DELETE all users which has been inactive for 2 years
ctx.Users.Where(x => x.LastLoginDate < DateTime.Now.AddYears(-2))
.Delete();
// DELETE using a BatchSize
ctx.Users.Where(x => x.LastLoginDate < DateTime.Now.AddYears(-2))
.Delete(x => x.BatchSize = 1000);
批量更新
// using Z.EntityFramework.Plus; // Don't forget to include this.
// UPDATE all users which has been inactive for 2 years
ctx.Users.Where(x => x.LastLoginDate < DateTime.Now.AddYears(-2))
.Update(x => new User() { IsSoftDeleted = 1 });
查询缓存
该扩展支持查询缓存,多次查询将从缓存返回,第一次查询,将返回结果并缓存。并且可以设置缓存策略:缓存策略与缓存时间。
// The query is cached using default QueryCacheManager options
var countries = ctx.Countries.Where(x => x.IsActive).FromCache();
// (EF5 | EF6) The query is cached for 2 hours
var states = ctx.States.Where(x => x.IsActive).FromCache(DateTime.Now.AddHours(2));
// (EF7) The query is cached for 2 hours without any activity
var options = new MemoryCacheEntryOptions() { SlidingExpiration = TimeSpan.FromHours(2)};
var states = ctx.States.Where(x => x.IsActive).FromCache(options);
缓存标签
var states = db.States.Where(x => x.IsActive).FromCache("countries", "states");
var stateCount = db.States.Where(x => x.IsActive).DeferredCount().FromCache("countries", "states");
// Expire all cache entry using the "countries" tag
QueryCacheManager.ExpireTag("countries");
延迟查询
LINQ扩展:Count、First、FirstOrDefault、Sum等都支持延迟查询。
// Oops! The query is already executed, we cannot use Query Cache or Query Future features
var count = ctx.Customers.Count();
// Query Cache
ctx.Customers.DeferredCount().FromCache();
// Query Future
ctx.Customers.DeferredCount().FutureValue();
查询过滤扩展
支持全局、实例或查询级别过滤扩展。
全局过滤
// CREATE global filter
QueryFilterManager.Filter<Customer>(x => x.Where(c => c.IsActive));
var ctx = new EntityContext();
// TIP: Add this line in EntitiesContext constructor instead
QueryFilterManager.InitilizeGlobalFilter(ctx);
// SELECT * FROM Customer WHERE IsActive = true
var customer = ctx.Customers.ToList();
实例过滤
var ctx = new EntityContext();
// CREATE filter
ctx.Filter<Customer>(x => x.Where(c => c.IsActive));
// SELECT * FROM Customer WHERE IsActive = true
var customer = ctx.Customers.ToList();
具体查询过滤
var ctx = new EntityContext();
// CREATE filter disabled
ctx.Filter<Customer>(CustomEnum.EnumValue, x => x.Where(c => c.IsActive), false);
// SELECT * FROM Customer WHERE IsActive = true
var customer = ctx.Customers.Filter(CustomEnum.EnumValue).ToList();
批量处理多个查询
扩展支持同时处理多个查询,减少多少链接数据库,来提高性能。
// GET the states & countries list
var futureCountries = db.Countries.Where(x => x.IsActive).Future();
var futureStates = db.States.Where(x => x.IsActive).Future();
// TRIGGER all pending queries (futureCountries & futureStates)
var countries = futureCountries.ToList();
过滤查询结果
比如返回状态为活动的列表
var ctx = new EntityContext();
// Load only active comments
var posts = ctx.Post.IncludeFilter(x => x.Comments.Where(x => x.IsActive));
查询SQL优化
通过同时包含和筛选子集合改进SQL生成。
var ctx = new EntityContext();
// Load only active comments using an optimized include
var posts = ctx.Post.IncludeOptimized(x => x.Comments.Where(x => x.IsActive));
此外该项目还指出批量操作:
1、批量保存
2、批量插入
3、批量合并
项目地址:https://github.com/zzzprojects/EntityFramework-Plus
- End -
推荐阅读
,
- 推荐一个简单、灵活、好看、强大的 .Net 图表库
- 推荐一个.Net常用代码集合,助你高效完成业务
- 一个基于.NetCore开发的可视化大屏幕报表系统
- .NetCore Mysql Vue MVC SqlSugar开源WMS仓库管理系统
- 一个基于.NetCore开发、模块化、跨平台、多语言商城系统
- 一个基于 .NET Core构建的简单、跨平台、模块化的小程序商城系统
免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com