专栏首页逸鹏说道EF批量操作数据与缓存扩展框架

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),作者:loresoft

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

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

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

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 在 EF 5 中跟踪SQL和缓存数据

    在EF4和EF5中需要跟踪执行SQL和缓存数据,微软官方有一个名为EFProviderWrappers的扩展示例非常值得学习,EFProviderWrapper...

    逸鹏
  • Red Hat与微软合作,将致力于构建企业级Linux版.NET

    微软和红帽声明将在红帽企业版Linux运行的.NET纳入官方支持。经两家公司透露,“红帽企业级Linux将成为Linux下的.NET Core主要参考操作系统...

    逸鹏
  • 06. Web大前端时代之:HTML5+CSS3入门系列~HTML5 画布(下)

    矩 阵 变 化 其实像 translate(移动),scale(缩放),rotate(旋转)都是特殊的矩阵变换 transform(m11,m12,m21,m2...

    逸鹏
  • 【数据库】实验2 单表查询

    1.熟练掌握SQL Server查询分析器的使用方法,加深对标准SQL查询语句的理解。

    韩旭051
  • JavaScript之insertBefore()和自定义insertAfter()的用法。

    在JS图片库的第五版开发完后http://www.cnblogs.com/GreenLeaves/p/5691797.html#js_Five_Version我...

    郑小超.
  • 【Flutter 实战】1.20版本更新及新增组件

    老孟导读:Flutter 1.20 更新了 Slider、RangeSlider、日期选择器组件、时间选择器组件的样式,新增了交换组件:InteractiveV...

    老孟Flutter
  • 程序员逻辑测试题(2)

    为了胎儿的健康,孕妇一定要保持身体健康。为了保持身体健康,她必须摄取足量的钙质,同时,为了摄取到足量的钙质,她必须喝牛奶。

    剑走天涯
  • 四大Java EE容器(Tomcat、JBoss、Resin、Glassfish)之简单比较(转)

    老七Linux
  • DBeaver 一个神奇的数据库操作软件

    在终端界面下操作 MySQL 会有一种酷酷的感觉,但是实际体验下来有诸多不便,譬如手抖“整”错行了,譬如粗心敲错代码等,此类情况的解决方法就是,重新来过。于是,...

    DataScience
  • Django的ListView超详细用法(含分页paginate)

    经常有从数据库中获取一批数据,然后在前端以列表的形式展现,比如:获取到所有的用户,然后在用户列表页面展示。

    砸漏

扫码关注云+社区

领取腾讯云代金券