Entity Framework 高性能 泛型缓存+动态Lambda
前言:自学CSharp挺长时间的了,这是我第一编博客,跟大家分享一下。如有不足地方请多多包涵,也欢迎大家提出更好的意见,下面开始进入正题。
一、泛型缓存
1.概念:1、泛型(泛型也是一种推断类型,从而实现不同类型可以使用同一个类或者方法、属性,大大的减少代码的冗余) 2、缓存(暂时存储)
2.应用场景(通俗易懂的理解):场景1、执行同参数的泛型方法时为了提高性能减少对方法体执行的次数,就可以使用泛型缓存之前执行过的返回值。
还有其他应用场景不一 一 举例,需要认真体会。
3.代码执行流程图

调用缓存方法的截图

完整的参考代码
/// <summary>
/// Lambda缓存
/// </summary>
/// <typeparam name="TSource">源类型</typeparam>
/// <typeparam name="TParameters">参数类型</typeparam>
public class LambdaCache<TSource, TParameters> where TSource : class where TParameters : class
{
private static Dictionary<string, Func<TSource, bool>> MapLambda { get; set; }
private static int CaceCount { get; set; }
static LambdaCache()
{
MapLambda = new Dictionary<string, Func<TSource, bool>>();
CaceCount = 20;
}
/// <summary>
/// 获取缓存动态Lambda
/// </summary>
/// <param name="parameters">参数对象</param>
/// <returns></returns>
public static Func<TSource, bool> GetDynamicLambda(TParameters parameters)
{
string key = string.Empty;
Dictionary<string, string> keyValues = GetPropertiesValue(parameters, out key);
if (!MapLambda.ContainsKey(key))
{
if (MapLambda.Count == CaceCount)
{
MapLambda.Clear();
}
MapLambda.Add(key, ExpressionExt.DynamicLambda<TSource>(keyValues));
}
return MapLambda[key];
}
/// <summary>
/// 获取对象属性值
/// </summary>
/// <param name="obj">对象</param>
/// <returns></returns>
private static Dictionary<string, string> GetPropertiesValue(object obj, out string key)
{
PropertyInfo[] properties = obj.GetType().GetProperties();
Dictionary<string, string> keyValues = new Dictionary<string, string>();
string value = string.Empty;
foreach (var item in properties)
{
var data = item?.GetValue(obj, null);
if (data is DateTime == false && !string.IsNullOrEmpty(data?.ToString()))
{
keyValues.Add(item.Name, data.ToString());
value += data;
}
}
if (string.IsNullOrEmpty(value))
{
value = obj.GetType().Name;//如果不选择任何条件则值为Null 考虑到参数实体名称不一致所以直接初始化为实体名称
}
key = value;
return keyValues;
}
}
/// <summary>
/// 动态Lambda
/// </summary>
/// <typeparam name="TSource">源类型</typeparam>
/// <param name="keyValues">参数键值对</param>
/// <returns></returns>
public static Func<TSource, bool> DynamicLambda<TSource>(Dictionary<string, string> keyValues)
{
//定义Lambda参数,列如常写的“x=>”
ParameterExpression parameter = Expression.Parameter(typeof(TSource), "x");
List<Expression> expressions = new List<Expression>();
foreach (var item in keyValues)
{
//定义lamada的属性成员
MemberExpression member = Expression.PropertyOrField(parameter, item.Key);
//定义筛选的操作
Expression expression = Expression.Equal(member, Expression.Constant(item.Value, member.Type));
expressions.Add(expression);
}
if (expressions.Count == 0)
{
return (TSource t1) => { return true; };//构造委托Lambda
}
Expression whereExpression = null;
//通过循环拼接 Lambda 完整表达式
foreach (var item in expressions)
{
if (whereExpression == null)
{
whereExpression = item;
}
else
{
whereExpression = Expression.And(whereExpression, item);
}
}
return Expression.Lambda<Func<TSource, bool>>(whereExpression, parameter).Compile();
}
总结:一个好的方法是通过不断的改进优化的,在此感谢常老师对我一些指导。
Entity Framework 高性能 泛型缓存+动态Lambda的更多相关文章
- Entity Framework学习笔记(六)----使用Lambda查询Entity Framework(1)
请注明转载地址:http://www.cnblogs.com/arhat 在前几章中,老魏一直使用Linq来查询Entity Framework.但是老魏感觉,如果使用Linq的话,那么Linq的返回 ...
- 《Entity Framework 6 Recipes》中文翻译系列 (38) ------ 第七章 使用对象服务之动态创建连接字符串和从数据库读取模型
翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 第七章 使用对象服务 本章篇幅适中,对真实应用中的常见问题提供了切实可行的解决方案. ...
- Entity FrameWork 中使用Lambda访问数据库性能优化
在使用Entity Framework 访问数据库时,我们经常使用Lambda表达式,但是如果不小心的话,很容易就掉到坑里了.比如下面的例子:用Lambda访问MSSqlServer中的NewsInf ...
- Entity Framework 实体框架的形成之旅--基于泛型的仓储模式的实体框架(1)
很久没有写博客了,一些读者也经常问问一些问题,不过最近我确实也很忙,除了处理日常工作外,平常主要的时间也花在了继续研究微软的实体框架(EntityFramework)方面了.这个实体框架加入了很多特性 ...
- entity framework 动态条件
entity framework 动态条件 问题:在实际编码过程中,根据不同的选择情况,会需要按照不同的条件查询数据集 如:状态confirmStatus ,如果为空的时候,查询全部,如果有具体值的时 ...
- 浅析Entity Framework Core2.0的日志记录与动态查询条件
前言 Entity Framework Core 2.0更新也已经有一段时间了,园子里也有不少的文章.. 本文主要是浅析一下Entity Framework Core2.0的日志记录与动态查询条件 去 ...
- 在Linq to sql 和 Entity framework 中使用lambda表达式实现left join
在Linq to sql 和 Entity framework 中使用lambda表达式实现left join 我们知道lambda表达式在Linq to sql 和 Entity framework ...
- .NET基础篇——利用泛型与反射更新实体(ADO.NET Entity Framework)(转)
自从ADO.NET Entity Framework面世以来,受到大家的热捧,它封装了大量代码生成的工具,用户只需要建立好实体之间的关系,系统就是会为用户自动成功了Add.Delete.CreateO ...
- Entity Framework泛型封装
Entity Framework本身的增删改查其实 已经很方便了,不过做项目的时候用的多了也就觉得有点累了,每个业务实体基本上都涉及到到了增删改查这四个基本的要素,至于封装每个公司可能都不一样,接口, ...
随机推荐
- C# unsafe模式内存操作深入探索
using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Run ...
- ss查看状态
ps -ef | grep ss-server | grep -v ps | grep -v grep
- 多个div嵌套,获取鼠标所点击的div对象
我选择的是冒泡事件 $(function() { $("#主divID").on("click",function(e) {//主div是必须存在的 //冒泡事 ...
- Cisco VPP启动流程
Cisco VPP启动流程,有需要的朋友可以参考一下. VPP初始化 VLIB_INIT_FUNCTION用来定义构造函数,注册函数到vlib_main_t->init_function_reg ...
- 2015年2月编程语言排行榜:JavaScript排名达到历史最高
JavaScript在赢得2014年最后一个月的TIOBE编程语言奖后,并且还在不断走强.在二月份JavaScript就超过了PHP,并 且达到它有史以来最高的位置,排行到TOP 6.另一方面,Obj ...
- WebSocket 教程(转载)
WebSocket 教程 作者: 阮一峰 日期: 2017年5月15日 WebSocket 是一种网络通信协议,很多高级功能都需要它. 本文介绍 WebSocket 协议的使用方法. 一.为什么需 ...
- 处理事件冒泡,阻止默认事件工具类,兼容IE
//处理事件冒泡,阻止默认事件工具类,兼容IEvar eventUtil={ // 添加句柄 addHandler:function(element,type,handler){ if(element ...
- java的static块及相关内容
原文地址:http://blog.csdn.NET/lubiaopan/article/details/4802430 感谢原作者! static{}(即static块),会在类被加载的时候执 ...
- 178. Rank Scores - database - 178. Rank Scores (Oracle)
题目链接 https://leetcode.com/problems/rank-scores/description/ 题意:对所有的分数按照降序进行排序,查询出分数和排名,排名相同的输出相同名 ...
- [SoapUI] DataSource, DataSourceLoop, DataSink
Script assertion in login: