前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >EF批量操作数据与缓存扩展框架

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

作者头像
逸鹏
发布2018-04-11 11:34:39
1.3K0
发布2018-04-11 11:34:39
举报
文章被收录于专栏:逸鹏说道逸鹏说道

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

下载安装

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

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

批量更新与删除数据

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

代码语言:javascript
复制
MyContext context = newMyContext();
context.Books.Where(b => b.Price >= 100).Delete();
context.SaveChanges();

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

代码语言:javascript
复制
MyContext context = newMyContext();
context.Books.Where(b => b.Price >= 100).Update(b => newBook { Price = 88 });
context.SaveChanges();

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

批量查询

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

代码语言:javascript
复制
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扩展框架中,您可以将获得列表与总记录数的查询包装在同一个数据库连接上进行,示例如下:

代码语言:javascript
复制
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扩展框架允许缓存查询结果,用法示例如下:

代码语言:javascript
复制
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秒
代码语言:javascript
复制
当然,您也可以给缓存打上TAG标记,标记缓存的好处是,在以后的查询中可以设置指定的缓存过期或者获取指定TAG所缓存的数据,示例如下:
代码语言:javascript
复制
MyContext context = newMyContext();var books = context.Books.Where(b => b.Price >= 100).FromCache(tags: new[] { "Books","100" });CacheManager.Current.Expire("Books"); //将标记为Books的缓存立即过期
代码语言:javascript
复制
值得注意的是,EF扩展框架默认使用MemoryCache系统内存进行缓存,如果您想第三方分布式缓存框架,只需要移除系统内存缓存,注入自己的缓存提供者即可,如下用Memcache缓存结果。
代码语言:javascript
复制
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尽量的解耦,并且能在编译时检查出更多的错误,但是上面的写法让人堵的慌,如果你也有这种感觉下面的写法是不是就是你脑子里想要的东西呢。

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

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

代码语言:javascript
复制
当第一次看到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,如果吞吐大的业务有限的话可以独立出来做;
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2016-10-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 我为Net狂 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 下载安装
  • 批量更新与删除数据
  • 批量查询
  • 缓存查询结果
  • 批量删除
  • 批量更新
  • 批量查询
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档