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

2023/7/6 02:13:35

"EntityFramework

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

下载安装

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

<span style=color: #000000;>PM > Install - Package EntityFramework.Extended

<span style=color: #000000;>框架安装后,你需要在您的类中是引用如下命名空间:

<span style=color: #0000ff;>using<span style=color: #000000;> EntityFramework.Extensions;

批量更新与删除数据

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

<span style=color: #2b91af;>MyContext<span style=color: #000000;> context = <span style=color: #0000ff;>new<span style=color: #2b91af;>MyContext<span style=color: #000000;>(); context.Books.Where(b => b.Price >= 100).Delete(); context.SaveChanges();

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

<span style=color: #2b91af;>MyContext<span style=color: #000000;> context = <span style=color: #0000ff;>new<span style=color: #2b91af;>MyContext<span style=color: #000000;>(); context.Books.Where(b => b.Price >= 100).Update(b => <span style=color: #0000ff;>new<span style=color: #2b91af;>Book<span style=color: #000000;> ); context.SaveChanges();

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

批量查询

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

<span style=color: #2b91af;>MyContext<span style=color: #000000;> context = <span style=color: #0000ff;>new<span style=color: #2b91af;>MyContext<span style=color: #000000;>();

<span style=color: #0000ff;>var<span style=color: #000000;> books = context.Books.Where(b => b.Price >= 100).Future(); <span style=color: #008000;>//生成第一个查询表达式 <span style=color: #0000ff;>var<span style=color: #000000;> accounts = context.Accounts.Where(a => a.Money <= 10).Future(); <span style=color: #008000;>//生成第二个查询表达式

<span style=color: #0000ff;>var<span style=color: #000000;> bookList = books.ToList(); <span style=color: #008000;>//在同一个数据库连接上查询上面两个表达式,只访问一次数据库

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

<span style=color: #2b91af;>MyContext<span style=color: #000000;> context = <span style=color: #0000ff;>new<span style=color: #2b91af;>MyContext<span style=color: #000000;>();

<span style=color: #0000ff;>var<span style=color: #000000;> query = context.Books.Where(b => b.Price >= 100); <span style=color: #0000ff;>var<span style=color: #000000;> query1 = query.Skip(pageIndex).Take(pageSize).Future(); <span style=color: #0000ff;>var<span style=color: #000000;> query2 = query.FutureCount();

<span style=color: #0000ff;>var<span style=color: #000000;> bookList = query1.ToList(); <span style=color: #0000ff;>var<span style=color: #000000;> bookTotalCount = query2.Value;

缓存查询结果

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

<span style=color: #2b91af;>MyContext<span style=color: #000000;> context = <span style=color: #0000ff;>new<span style=color: #2b91af;>MyContext<span style=color: #000000;>();

<span style=color: #0000ff;>var<span style=color: #000000;> books = context.Books.Where(b => b.Price >= 100).FromCache(); <span style=color: #008000;>//不指定时间,使用默认的缓存时间 <span style=color: #0000ff;>var<span style=color: #000000;> books2= context.Books.Where(b => b.Price >= 100).FromCache(<span style=color: #2b91af;>CachePolicy<span style=color: #000000;>.WithDurationExpiration(<span style=color: #2b91af;>TimeSpan<span style=color: #000000;>.FromSeconds(300))); <span style=color: #008000;>//将结果缓存300秒

<span style=color: #008000;><span style=color: #000000; font-family: Calibri;>当然,您也可以给缓存打上TAG标记,标记缓存的好处是,在以后的查询中可以设置指定的缓存过期或者获取指定TAG所缓存的数据,示例如下:

<span style=color: #2b91af;>MyContext<span style=color: #000000;> context = <span style=color: #0000ff;>new<span style=color: #2b91af;>MyContext<span style=color: #000000;>();

<span style=color: #0000ff;>var<span style=color: #000000;> books = context.Books.Where(b => b.Price >= 100).FromCache(tags: <span style=color: #0000ff;>new<span style=color: #000000;>[] { <span style=color: #a31515;>Books<span style=color: #000000;>,<span style=color: #a31515;>100<span style=color: #000000;> }); <span style=color: #2b91af;>CacheManager<span style=color: #000000;>.Current.Expire(<span style=color: #a31515;>Books<span style=color: #000000;>); <span style=color: #008000;>//将标记为Books的缓存立即过期

<span style=color: #008000;><span style=color: #000000; font-family: Calibri;>值得注意的是,EF扩展框架默认使用MemoryCache系统内存进行缓存,如果您想第三方分布式缓存框架,只需要移除系统内存缓存,注入自己的缓存提供者即可,如下用Memcache缓存结果。

<span style=color: #2b91af;>Locator<span style=color: #000000;>.Current.Register<<span style=color: #2b91af;>ICacheProvider<span style=color: #000000;>>(() => <span style=color: #0000ff;>new<span style=color: #000000;> MemcachedProvider());

以上就是EntityFramework.Extended扩展库的所有内容,感谢支持零度,希望对您有所帮助。"