EFCore扩展:IQueryable(linq)或sql执行的查询缓存与清理
前言
上一篇讲述了执行sql和配置的一些功能,这篇说明IQueryable(linq)或执行sql的查询缓存与清理,包括扩展到将缓存存储到Redis中。
扩展类库源码:
github:https://github.com/skigs/EFCoreExtend
引用类库:
nuget:https://www.nuget.org/packages/EFCoreExtend/
PM> Install-Package EFCoreExtend
查询缓存引用Redis:
PM> Install-Package EFCoreExtend.Redis
IQueryable(linq)查询缓存
DbContext:
public class MSSqlDBContext : DbContext { protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { if (optionsBuilder.IsConfigured == false) { optionsBuilder.UseSqlServer(@"data source=localhost;initial catalog=TestDB;uid=sa;pwd=123;"); } base.OnConfiguring(optionsBuilder); } public DbSet<Person> Person { get; set; } }
表实体:
[Table(nameof(Person))] public class Person { public int id { get; set; } public string name { get; set; } [Column(TypeName = "datetime")] public DateTime? birthday { get; set; } public int? addrid { get; set; } }
IQueryable查询缓存:
DbContext db = new MSSqlDBContext(); var person = db.Set<Person>(); //缓存不过期:参数一为表名(缓存清理的时候有用:根据表名清理缓存) // 参数二缓存过期策略,如果不设置为缓存不过期 IReadOnlyList<Person> list = person.Where(l => l.name == "tom1").ListCache(nameof(Person), null); //这行和上面的一样 var list0 = person.Where(l => l.name == "tom1").ListCache<Person, Person>(null);
缓存清理:
////缓存清理 //根据指定的IQueryable清理缓存(Person表下的) person.Where(l => l.name == "tom1").ListCacheRemove<Person>(); //移除指定缓存类型的所有缓存:List(Person表下的) EFHelper.Services.Cache.ListRemove<Person>(); //移除Person表下的所有缓存 EFHelper.Services.Cache.Remove<Person>();
查询缓存期限:
//缓存过期 var list1 = person.Where(l => l.name == "tom2") .ListCache(nameof(Person), ))); //15分钟 //这行和上面的一样 var list11 = person.Where(l => l.name == "tom2") .ListCache<Person, Person>(TimeSpan.FromMinutes()); //15分钟 var list2 = person.Where(l => l.name == "tom3") .ListCache<Person, Person>(DateTime.Parse("2018-1-1")); //指定DateTime
缓存期限更新:
//缓存期限更新 ), true); //第二个参数指定每次获取都更新缓存时间 var list3 = person.Where(l => l.name == "tom4").ListCache(nameof(Person), policy); //15分钟
其他类型的查询缓存与清理
DbContext db = new MSSqlDBContext(); var person = db.Set<Person>(); var query = person.Where(l => l.name == "tom1"); ////FirstOrDefault )); //根据指定的IQueryable清理缓存(Person表下的) query.FirstOrDefaultCacheRemove<Person>(); //移除指定缓存类型的所有缓存:FirstOrDefault(Person表下的) EFHelper.Services.Cache.FirstOrDefaultRemove<Person>(); ////Count )); //根据指定的IQueryable清理缓存(Person表下的) query.CountCacheRemove<Person>(); //移除指定缓存类型的所有缓存:Count(Person表下的) EFHelper.Services.Cache.CountRemove<Person>(); ////LongCount )); //根据指定的IQueryable清理缓存(Person表下的) query.LongCountCacheRemove<Person>(); //移除指定缓存类型的所有缓存:LongCount(Person表下的) EFHelper.Services.Cache.LongCountRemove<Person>(); ////其他类型的缓存 //参数一:缓存类型,参数二:需要返回的数据 query.Cache<Person, )); query.CacheRemove<Person>("sum"); //清理指定类型下的指定IQueryable的缓存 //移除指定缓存类型的所有缓存:sum EFHelper.Services.Cache.Remove<Person>("sum");
SQL执行的查询缓存
DbContext db = new MSSqlDBContext(); string sql = $"select * from {nameof(Person)} where name=@name"; )); var pararmModel = new { name = name }; ////query的sql缓存 IReadOnlyList<Person> list = db.QueryCacheUseModel<Person, Person>( sql, pararmModel, null, null, policy); //根据指定的sql清理缓存(Person表下的) db.QueryCacheRemoveUseModel<Person>(sql, pararmModel, null); //移除query类型的所有缓存(Person表下的) EFHelper.Services.Cache.QueryRemove<Person>(); string sql1 = $"select count(*) from {nameof(Person)} where name=@name"; ////scalar的sql缓存 object val = db.ScalarCacheUseModel<Person>(sql1, pararmModel, null, policy); //根据指定的sql清理缓存(Person表下的) db.ScalarCacheRemoveUseModel<Person>(sql, pararmModel, null); //移除scalar类型的所有缓存(Person表下的) EFHelper.Services.Cache.ScalarRemove<Person>();
使用Redis存放查询缓存
查询缓存引用Redis:PM> Install-Package EFCoreExtend.Redis
程序初始化的时候调用:
//使用Redis存放查询缓存 EFHelper.ServiceBuilder.AddQueryCacheCreator(sp => new RedisQueryCacheCreator("127.0.0.1:6379,allowAdmin=true")) .BuildServices(); //重新编译服务
EFCore扩展:IQueryable(linq)或sql执行的查询缓存与清理的更多相关文章
- Linq To Sql 语法 子查询 & In & Join
子查询 描述:查询订单数超过5的顾客信息 查询句法: var 子查询 =from cin ctx.Customers where ...
- wcf+linq to sql中关联查询返回数据问题
前段时间准备采用wcf+nh框架开发sl程序,发现采用nh开发不适合我的中型.并且快速开发项目,所以综合考量了下,决定采用wcf+linq to sql . 但是此模式也有缺点,也是linq to s ...
- linq to sql中的自动缓存(对象跟踪)
linq to sql中,对于同一个DataContext上下文环境,根据表主键选择记录时(当然这里所指的“记录”会自动转成“对象”),如果该记录已经被select过,默认情况下会被自动缓存下来,下次 ...
- asp.net LINQ连接数据库SQL执行数据的增加、修改、删除、查询操作
查询数据库中的数据 using System; using System.Collections.Generic; using System.Linq; using System.Web; using ...
- Webform中linq to sql多条件查询(小练习)
多条件查询:逐条判断,从第一个条件开始判断,如果满足,取出放入集合,再从集合中查询第二个条件... aspx代码: <body> <form id="form1" ...
- Linq to Sql 左连接查询
var query = from t0 in context.ExpressSendMaster join t1 in context.Supplier on t0.SupplierCode equa ...
- LinQ to sql 各种数据库查询方法
1.多条件查询: 并且 && 或者 || var list = con.car.Where(r => r.code == "c014" || r.oil == ...
- Linq To Sql的各种查询
一.Inner Join //request为查询条件 var result = from a in db.TableA join b in db.TableB on a.ID equal ...
- linq to sql 动态构建查询表达式树
通过Expression类进行动态构造lamda表达式. 实现了以下几种类型,好了代码说话: public Expression<Func<T, bool>> GetAndLa ...
随机推荐
- PAT (Advanced Level) 1019. General Palindromic Number (20)
简单题. #include<iostream> #include<cstring> #include<cmath> #include<algorithm> ...
- (五)Jquery Mobile列表
Jquery Mobile列表 一.JM列表 1.普通列表 效果: 带序号的列表 将ul换成ol 效果: 2.data-inset=& ...
- SpringMVC轻松学习-环境搭建(二)
基于spring2.5的采用XML配置的spring MVC项目 注:本项目全部基于XML配置.同时,集成了hibernate.采用的是:spring MVC+hibernate+spring的开发架 ...
- WEB前端资源集(一)
做前端已经一年了,开发中换过很多开发工具,遇到bug到处求解,以及自学时到处找相关文章及教程,所以经过这么多的风波,我总结了一些对大家有帮助的网站,主题也将长期更新. 资源网站篇 CSDN:全球最大中 ...
- java中有几种类型的流?JDK为每种类型的流提供了一些抽象类以供继承,请说出他们分别是哪些类?
java中有几种类型的流?JDK为每种类型的流提供了一些抽象类以供继承,请说出他们分别是哪些类? Java中的流分为两种,一种是字节流,另一种是字符流,分别由四个抽象类来表示(每种流包括输入和输出两种 ...
- 从内存中加载DLL Delphi版(转)
源:从内存中加载DLL DELPHI版 原文 : http://www.2ccc.com/article.asp?articleid=5784 MemLibrary.pas //从内存中加载DLL D ...
- brew udpate出现错误“/usr/local is not writable.”的问题解决
如图所示: 在命令行输入: sudo chown -R 当前登录的用户名 /usr/local 再次输入: brew update 问题解决.
- Android线程之异步消息处理机制(一)
Android不允许在子线程中进行UI操作,但是有些时候,我们必须在子线程里去执行一些耗时任务,然后根据任务的执行结果来更新相应的UI控件.对于这种情况,Android提供了一套异步消息处理机制,完美 ...
- Xcode的版本问题
1. 已经安装了Xcode6,如何再安装Xcode5,并使两者共存? 2. Xcode6升级到Xcode7 适配问题 3. XCODE6中使用iOS7 SDK的方法: 从XCODE 5的目录中: /A ...
- 【转】50条大牛C++编程开发学习建议
每个从事C++开发的朋友相信都能给后来者一些建议,但是真正为此进行大致总结的很少.本文就给出了网上流传的对C++编程开发学习的50条建议,总结的还是相当不错的,编程学习者(不仅限于C++学习者)如果真 ...