EF批量操作数据与缓存扩展框架

在原生的EF框架中,针对批量数据操作的接口有限,EF扩展框架弥补了EF在批量操作时的接口,这些批量操作包括:批量修改、批量查询、批量删除和数据缓存,如果您想在EF中更方便的批量操作数据,这个扩展将对您来说很有用。

下载安装

这个框架支持通过NuGet包管理器进行安装,你可以在包管理器中搜索:EntityFramework.Extended,最简单的方法就是程序包管理控制台进行安装,安装命令如下:

PM > Install - Package EntityFramework.Extended
框架安装后,你需要在您的类中是引用如下命名空间:
using EntityFramework.Extensions;

批量更新与删除数据

在EF中默认提供的更新和删除操作,你必须首先将数据查询到内存中,这在有些时候,性能是非常差的,而通过EntityFramework.Extended你只需要通过LINQ生成表达式即可直接批量删除或更新,示例代码如下:

MyContext context = newMyContext();
context.Books.Where(b => b.Price >= 100).Delete();
context.SaveChanges();

以上示例演示批量删除图书价格大于等于100的所有记录

MyContext context = newMyContext();
context.Books.Where(b => b.Price >= 100).Update(b => newBook { Price = 88 });
context.SaveChanges();

以上示例演示将图书价格大于100所有记录的价格修改成88元

批量查询

这个扩展框架允许你将多个查询表达式包装在同一个连接进行查询,这样可以减少数据库连接数,从而提高查询性能,示例如下:

MyContext context = newMyContext();var books = context.Books.Where(b => b.Price >= 100).Future(); //生成第一个查询表达式var accounts = context.Accounts.Where(a => a.Money <= 10).Future(); //生成第二个查询表达式var bookList = books.ToList(); //在同一个数据库连接上查询上面两个表达式,只访问一次数据库

在分页的时候,我们经常需要知道分页列表与总记录数,如果你用默认EF提供的方法进行查询,你需要访问两次数据库,在EF扩展框架中,您可以将获得列表与总记录数的查询包装在同一个数据库连接上进行,示例如下:

MyContext context = newMyContext();var query = context.Books.Where(b => b.Price >= 100);var query1 = query.Skip(pageIndex).Take(pageSize).Future();var query2 = query.FutureCount();var bookList = query1.ToList();var bookTotalCount = query2.Value;

缓存查询结果

EF扩展框架允许缓存查询结果,用法示例如下:

MyContext context = newMyContext();var books = context.Books.Where(b => b.Price >= 100).FromCache(); //不指定时间,使用默认的缓存时间var books2= context.Books.Where(b => b.Price >= 100).FromCache(CachePolicy.WithDurationExpiration(TimeSpan.FromSeconds(300))); //将结果缓存300秒
当然,您也可以给缓存打上TAG标记,标记缓存的好处是,在以后的查询中可以设置指定的缓存过期或者获取指定TAG所缓存的数据,示例如下:
MyContext context = newMyContext();var books = context.Books.Where(b => b.Price >= 100).FromCache(tags: new[] { "Books","100" });CacheManager.Current.Expire("Books"); //将标记为Books的缓存立即过期
值得注意的是,EF扩展框架默认使用MemoryCache系统内存进行缓存,如果您想第三方分布式缓存框架,只需要移除系统内存缓存,注入自己的缓存提供者即可,如下用Memcache缓存结果。
Locator.Current.Register<ICacheProvider>(() => new MemcachedProvider());

以上就是EntityFramework.Extended扩展库的所有内容

原文:

今天乍一看,园子里居然没有关于这个类库的文章,实在是意外毕竟已经有很多介绍EF使用的文章了。

E文好的可以直接看https://github.com/loresoft/EntityFramework.Extended

也可以在nuget上直接安装这个包,它的说明有点过时了,最新版本已经改用对IQueryable<T>的扩展,而不是DbSet<T>(已经标记为弃用),所以跟我一样有隔离癖好的就可以大胆使用了。下面介绍如何批量删除、更新、查询。

批量删除

本来我们需要这样删除

//EF原生的删除需要先取出entity然后removecontext.Remove(context.Users.First(u=>u.Key==xxx);//如果要删除更多foreach(var user in context.Users.Where(u => u.FirstName == "firstname").ToList()){context.Remove(user);}

本来一句sql可以解决的问题,变得复杂了。

使用ORM是为了跟sql尽量的解耦,并且能在编译时检查出更多的错误,但是上面的写法让人堵的慌,如果你也有这种感觉下面的写法是不是就是你脑子里想要的东西呢。

----引用EF Extend Libary后删除只需要一次就完成了,效率高了很多,也不需要太多的连接资源,使用更方便了

//delete all users where FirstName matchescontext.Users.Delete(u => u.FirstName == "firstname");//当然如果我这样写也可以context.Users.Where(...).Delete();

当第一次看到EF EL的时候就被这种写法吸引住了,这不就是我们一直找的东西么。

批量更新

//批量更新用户名中包含大写J的用户设置工资为999context.Users.Update( u => u.Name.Contans("J"), u2 => new User {Salary = 999}); //第一个参数也可以传入已经有的IQuaryable的参数如下var users = context.Users.Where(u => u.FirstName == "firstname");context.Users.Update(users, u => new User {FirstName = "newfirstname"});<br><br>//当然了我最喜欢的还是这样的写法<br>context.Users.Where(u => u.FirstName == "firstname").Update(u=>new User{FirstName = "newfirstname"})

批量查询

其实现在的查询已经很棒了,默认的延迟查询都能满足基本需求,但是有时候总希望更极致一点,比如现有的查询无法满足分页这个顽固的需求。

//看看EF EL怎么解决// 复用的查询var q = db.Tasks.Where(t => t.Priority == 2);// 获取总数var q1 = q.FutureCount();// 获取分页的数据var q2 = q.Skip(pageIndex).Take(pageSize).Future(); // 这里会触发上面所有Future函数中的查询包装到一个连接中执行int total = q1.Value;//因为已经得到结果了,这里不会再次查询var tasks = q2.ToList();

 -------------------------------------------------------------------------------------------------------------------------------------------------

编辑于20160607

有段时间没用csharp了,上面写的是刚用efe时的笔记,一直没有回复大家很抱歉。

  1. efe不支持mysql;
  2. 不建议吞吐大的用ef,如果吞吐大的业务有限的话可以独立出来做;

原文发布于微信公众号 - 我为Net狂(dotNetCrazy)

原文发表时间:2016-10-26

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏智能大石头

XCode读取Excel数据(适用于任何数据库)

虽然是充血模型,虽然是强类型,XCode同样支持遍历任何数据库结构,并以强类型(相对于DataSet等字典访问)方式读取数据。 要遍历数据库结构是很容易的事情,...

2178
来自专栏程序员的SOD蜜

PostgreSQL的PDF.NET驱动程序构建过程

目前有两种主要的PostgreSQL的.NET驱动程序,分别是Npgsql和dotConnector for PostgreSQL(以下简称dotConnect...

2367
来自专栏LanceToBigData

HttpClient(二)HttpClient使用Ip代理与处理连接超时

前言   其实前面写的那一点点东西都是轻轻点水,其实HttpClient还有很多强大的功能:   (1)实现了所有 HTTP 的方法(GET,POST,PUT,...

3828
来自专栏Porschev[钟慰]的专栏

【2013年】开发常见问题回顾(一)

记录开发中遇到的和别人问的较多的问题.... IE10中LinkButton不可用     这应该是2013年初遇到的一个BUG,当使用Asp.Net开发Web...

2865
来自专栏Jackson0714

玩转PowerShell第一节——【后台任务处理】-技术&分享

3066
来自专栏乐百川的学习频道

Vert.x学习笔记(二) Vert.x Web Client

本文参考自Vert.x Web Client官方文档。套用官网的话来说, Vert.x Web Client是一个异步的HTTP和HTTP/2网络客户端。 ...

4916
来自专栏Golang语言社区

[Go 语言社区] Golang架构底层---日志函数

服务器后台架构,日志是必不可少的一个功能模块,日志可以分为很多中:统计日志,访问日志,错误日志等 今天大家发是运行中的日志函数 // 日志函数,传入数据为字...

3336
来自专栏大内老A

如何实现对上下文(Context)数据的统一管理 [提供源代码下载]

在应用开发中,我们经常需要设置一些上下文(Context)信息,这些上下文信息一般基于当前的会话(Session),比如当前登录用户的个人信息;或者基于当前方法...

4876
来自专栏Jackson0714

玩转PowerShell第三节——【SCOM Maintenance Mode】-技术&分享

3165
来自专栏技术小讲堂

ASP.NET AJAX(15)__构建高性能ASP.NET AJAX应用UpdatePanel的性能问题使用UpdatePanel的注意事项脚本加载避免脚本阻塞页面显示AjaxControlTool

UpdatePanel的性能问题 在UpdatePanle使用的时候,它每次的更新都是将整个页面回送的,而且也会加上一些他更新的标记,所以往往它传递的数据量比传...

32210

扫码关注云+社区

领取腾讯云代金券