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 ...
随机推荐
- RS485通讯协议的应用 (转)
源:http://blog.chinaunix.net/uid-26921272-id-3506640.html RS485缺点: RS485总线是一种常规的通信总线,它不能够做总线的自动仲裁,也就是 ...
- python第一天(文件流以及控制流)简单总结
第一天的python学习主要是: (1)对python的一个大致了解 值得注意的是在window下开发要注意path的问题. (2)对python控制流的一个了解 常用的if ,while ,for ...
- Mybatis 示例之 Association - 偶尔记一下 - 博客频道 - CSDN.NET
body { font-family: "Microsoft YaHei UI","Microsoft YaHei",SimSun,"Segoe UI ...
- 求两个字符串最大的子字符串C#
此代码由Java改写而来,字符串支持中文格式的. string str1 = "中国ab-15"; string str2 = "中国ab-23"; byte[ ...
- 《SpringMVC数据绑定入门》笔记
基本类型 最好使用封装类型 简单多数据&多层级对象 简单多数据 单个对象,直接使用属性名=值即可 多层级对象 属性.属性=值即可 同属性多对象 WebDataBinder只在当前类中生效,不是 ...
- iOS 获取本地文件的各种坑
1.无论:TXT,EPUB,PDF等各种格式的文件,保存到本地的时候,最好都保存成字母或者数字,不要保存成汉字,否则,在取文件的时候,由于编码的问题,各种瓦特 2.如果文件名真的保存成了汉字,那么进行 ...
- VB.NET中网络编程的另一种方案----system.net中的HttpWebRequest类的使用
VB.NET中网络编程的另一种方案---- system.net中的HttpWebRequest类的使用 在VB.net中进行网络编程,除了我之前写的随笔中的使用WinHttp组件进行编程,还有另一种 ...
- cocos2d-x 定时器selector的使用 :schedule的使用
在游戏设计时,我们需要不断的改变屏幕显示来反映游戏操作的效果,最简单的就是提示用户已经进行的游戏时间.为此,我们需要使用cocos2d-x内置的任务调度机制,即CCNode的schedule成员函数. ...
- 数据结构-String、char
String 常用方法: 获取长度:int length = strl.length() 获取第i个字符:char iChar = str.charAt(i) String转成字符数组:char[] ...
- python获取绑定的IP,并动态指定出口IP
在做采集器的过程中,经常会遇到IP限制的情况,这时候可以通过切换IP能继续访问. 如果是多IP的服务器,那么可以通过切换出口Ip来实现. 1.首先是如何获取服务器绑定的IP import netifa ...