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的所有记录
1
2
3
|
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扩展库的所有内容,来自零度分享。
http://www.xcode.me/book/entity-framework-extended
EF批量操作数据与缓存扩展框架的更多相关文章
- EF批量插入太慢?那是你的姿势不对
大概所有的程序员应该都接触过批量插入的场景,我也相信任何的程序员都能写出可正常运行的批量插入的代码.但怎样实现一个高效.快速插入的批量插入功能呢? 由于每个人的工作履历,工作年限的不同,在实现这样的一 ...
- Asp.net 面向接口可扩展框架之“Mvc扩展框架及DI”
标题“Mvc扩展框架及DI”有点绕口,我也想不出好的命名,因为这个内容很杂,涉及多个模块,但在日常开发又密不可分 首先说Mvc扩展框架,该Mvc扩展就是把以前的那个Mvc分区扩展框架迁移过来,并优化整 ...
- Asp.net 面向接口可扩展框架之数据处理模块及EntityFramework扩展和Dapper扩展(含干货)
接口数据处理模块是什么意思呢?实际上很简单,就是使用面向接口的思想和方式来做数据处理. 还提到EntityFramework和Dapper,EntityFramework和Dapper是.net环境下 ...
- Asp.net 面向接口可扩展框架之消息队列组件
消息队列对大多数人应该比较陌生.但是要提到MQ听说过的人会多很多.MQ就是英文单词"Message queue"的缩写,翻译成中文就是消息队列(我英语差,翻译错了请告知). PS: ...
- Asp.net 面向接口可扩展框架之核心容器(含测试代码下载)
新框架的容器部分终于调通了!容器实在太重要了,所以有用了一个名词叫“核心容器”. 容器为什么那么重要呢?这个有必要好好说道说道. 1.首先我们从框架名称面向接口编程说起,什么是面向接口编程?(这个度娘 ...
- Asp.net 面向接口可扩展框架之应用程序上下文作用域组件
在团队中推广面向接口开发两年左右,成果总体来说我还是挺满意的,使用面向接口开发的模块使用Unity容器配置的功能非常稳定,便于共享迁移(另一个项目使用只需要复制配置和调用接口即可),如果再配合上DI那 ...
- Hibernate、批量操作数据
Hibernate 批量操作数据可以使用两种方法实现 1.分批更新,每一小批同步一次数据: public void saveEmployee2(){ Session s=HibernateSessio ...
- 面向接口可扩展框架之“Mvc扩展框架及DI”
面向接口可扩展框架之“Mvc扩展框架及DI” 标题“Mvc扩展框架及DI”有点绕口,我也想不出好的命名,因为这个内容很杂,涉及多个模块,但在日常开发又密不可分 首先说Mvc扩展框架,该Mvc扩展就是把 ...
- ehcache模糊批量移除缓存
目录 前言 实现 总结 前言 众所周知,encache是现在最流行的java开源缓存框架,配置简单,结构清晰,功能强大.通过注解@Cacheable可以快速添加方法结果到缓存.通过@CacheEvic ...
随机推荐
- .net framework 4.5 +steeltoe+ springcloud(三)实现Hystrix断路器
在基于.net framework的服务客户端实现断路器功能,基本项目创建步骤可以参照我的另一篇发现和调用服务的笔记,地址:http://www.cnblogs.com/troytian/p/8621 ...
- 杂谈--SQL SERVER版本
SQL SERVER 内部版本号: SQL Server Version Internal Database Version SQL Server 2014 782 SQL Server 2012 ...
- 工作随笔——elasticsearch 6.6.1安装(docker-compose方式)
docker-compose.yml: version: '2.2' services: es1: image: docker.elastic.co/elasticsearch/elasticsear ...
- C# 开源仪表盘库—Agauge App
1.简介 有个叫A.J.Bauer 的大神在System.Windows.Forms.Control类的基础上建立了一个显示各种仪表盘的类. 英文版简介:C# Tu ...
- .net图表之ECharts随笔07-自定义系列(多边形)
搞了一天多,才勉强搞出了一个不紧凑的六边形统计图,是真的菜. 这里ECharts的用法与06说的同一种,直接使用带all的js 先上个效果图,用面积来表示人数的多少 1. 参数option的toolt ...
- 存储过程 Mvc 的调用
/// <summary> /// 根据条件,使用存储过程分页查询电影 /// </summary> /// <param na ...
- 一些小案例_C#
下面是一些小的案例.(C#) 1,求一段数第n位 //1 1 2 3 5 8 求30位 //规律是前两位之和是第三位数, ;//定义第一位 ;//定义第二位 ;//总和 ; i < ; i++) ...
- Linux Shell常用脚本整理
轮询检测Apache状态并启用钉钉报警◆ #!/bin/bash shell_user="root" shell_domain="apache" shell_l ...
- HTML引入JS文件
浏览器解析HTML文件时,先判断script 标签中是否有src属性,有则执行指定路径下的JS文件,没有则执行script标签中的js脚本. 1. HTML内嵌JS head里面添加script元素, ...
- POJ 2894
#include<iostream> #define MAXN 1005 using namespace std; int a[MAXN]; int main() { //freopen( ...