推荐一个EntityFramework扩展的开源项目

简介: 通过必备功能扩展了DbContext:包括过滤器,缓存,提前查询,批量操作等EF扩展功能。

对于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 -

专注分享编程知识、热门有用有趣的开源项目

相关文章
|
SQL 关系型数据库 MySQL
开源Dapper的Lambda扩展-Sikiro.Dapper.Extension V2.0
开源Dapper的Lambda扩展-Sikiro.Dapper.Extension V2.0
200 0
开源Dapper的Lambda扩展-Sikiro.Dapper.Extension V2.0
|
开发工具
visual studio单项目一次生成多框架类库、多框架项目合并
目录 不同平台框架项目使用同一套代码,一次编译生成多个框架类库 需要先了解的东西 分析 添加PropertyGroup 多目标平台 编译符号和输出目录设置 添加依赖 代码文件处理 主副平台项目文件处理 最后 补充 自动生成内部版本号 nuget包相关 不同平台框架项目使用同一套代码,一次编译生成多个框架类库 需要先了解的东西 msbuild .
1447 0
|
JavaScript 前端开发 测试技术
ABP框架 - 介绍
原文:ABP框架 - 介绍 文档目录   本节内容: 简介 一个快速示例 其它特性 启动模板 如何使用   简介 我们总是对不同的需求开发不同的应用。但至少在某些层面上,一次又一次地重复实现通用的和类似的功能。
3442 0
|
SQL 前端开发 .NET
Asp.net 面向接口可扩展框架之数据处理模块及EntityFramework扩展和Dapper扩展(含干货)
原文:Asp.net 面向接口可扩展框架之数据处理模块及EntityFramework扩展和Dapper扩展(含干货) 接口数据处理模块是什么意思呢?实际上很简单,就是使用面向接口的思想和方式来做数据处理。
1136 0