Lambda 表达式动态拼接.
背景:
项目使用EF 查询时需要手动判断条件写.觉得太麻烦就Google 如何动态生成Linq.最后找到了 System.Linq.Dynamic.Core. 这个东西.

Scott Guthrie 老爷子也有参与.
在Nuget 中直接查找 安装 .
引用 System.Linq.Dynamic.Core; System.Linq.Expressions; 这两个命名空间 并在合适的地方编写如下帮助类
public class LinqExpressionBuilder<TEntity>
{
/// <summary>
/// 生成查询表达式
/// </summary>
/// <param name="dto"></param>
/// <param name="excludeFields"></param>
/// <returns></returns>
public Expression<Func<TEntity, bool>> Build(object dto, Dictionary<string, object> excludeFields = null)
{
var parameters = GenerateParametersDictionary(dto, excludeFields); StringBuilder sb = new StringBuilder();
var fieldNames = parameters.Keys.ToList(); // 动态拼接
for (int i = ; i < fieldNames.Count; i++)
{
//自定义查询拼接
if (fieldNames[i] == "BeginDate")
{
sb.Append("CreateTime").Append($" > @{i}").Append(" && ");
continue;
}
if (fieldNames[i] == "EndDate")
{
sb.Append("CreateTime").Append($" < @{i}").Append(" && ");
continue;
}
sb.Append(fieldNames[i]).Append($" == @{i}").Append(" && ");
} var lambdaStr = sb.ToString();
lambdaStr = lambdaStr.Substring(, lambdaStr.Length - " && ".Length); // 构建表达式
var Expression = DynamicExpressionParser.ParseLambda<TEntity, bool>(new ParsingConfig()
, false, lambdaStr, parameters.Values.ToArray());
return Expression;
} /// <summary>
/// 生成查询字典
/// </summary>
/// <param name="dto">对象</param>
/// <param name="excludeFields">过滤器</param>
/// <returns></returns>
private Dictionary<string, object> GenerateParametersDictionary(object dto, Dictionary<string, object> excludeFields = null)
{
var ExcludeFields = excludeFields ?? new Dictionary<string, object>();
var type = dto.GetType();
var typeInfo = type;
var properties = typeInfo.GetProperties();
var parameters = new Dictionary<string, object>(); foreach (var property in properties)
{
var propertyValue = property.GetValue(dto); if (propertyValue == null) continue;
if (dto == null) continue;
if (ExcludeFields.ContainsKey(property.Name)) continue;
//DateTime类型较为特殊
if (property.PropertyType == typeof(DateTime) && propertyValue.ToString() == "0001/1/1 0:00:00") continue;
if (parameters.ContainsKey(property.Name)) continue; parameters.Add(property.Name, propertyValue);
} return parameters;
} }
在项目中使用.
var LinqHelper = new LinqExpressionHelper<PayProcessRecord>();
var linq = LinqHelper.Build(reqPayTrade);
var dbData = query.Find(linq);
结束
Lambda 表达式动态拼接.的更多相关文章
- Lambda表达式动态拼接(备忘)
EntityFramework动态组合Lambda表达式作为数据筛选条件,代替拼接SQL语句 分类: C# Lambda/Linq Entity Framework 2013-05-24 06:58 ...
- Lambda表达式公共拼接函数(原创)
#region Lambda公共拼接函数 /// <summary> /// LambdaWhere(枚举) /// </summary> public enum Lambda ...
- Lambda表达式动态组装查询条件
最近比较闲,年底了,项目也进入尾声:每天就是维护一下系统,整理整理文档,整理知识点,这样才觉得有点意思: 问题 在使用Linq的where()查询的时候,不知道大家是怎么动态组装多个查询条件时,是怎么 ...
- el表达式动态拼接变量_c:set的用法
转自:https://blog.csdn.net/xb12369/article/details/39581955如 何在${}中使用${},例:${user.name_${user.id}},use ...
- 动态LINQ(Lambda表达式)构建
using System; using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; us ...
- Lambda 表达式 是 个 好东东
Lambda 表达式 是 个 好东东 首先,通过 Lambda 表达式 + 动态语言特性 dynamic , C# 已经 可以 实现 函数式 编程 了 其次, 利用 Lambda, 可以 实现 AOP ...
- 表达式树动态拼接lambda
动态拼接lambda表达式树 前言 最近在优化同事写的代码(我们的框架用的是dapperLambda),其中有一个这样很普通的场景——界面上提供了一些查询条件框供用户来进行过滤数据.由于dappe ...
- 动态拼接lambda表达式树
前言 最近在优化同事写的代码(我们的框架用的是dapperLambda),其中有一个这样很普通的场景——界面上提供了一些查询条件框供用户来进行过滤数据.由于dapperLambda按条件查询时是传入表 ...
- 【转】EntityFramework动态组合Lambda表达式作为数据筛选条件,代替拼接SQL语句
传统的操作数据库方式,筛选数据需要用StringBuilder拼接一大堆的WHERE子句. 在Entity Framework中,代码稍有不慎就会造成巨大性能消耗,如: using(var db=ne ...
随机推荐
- python接入微博第三方API之1环境准备
环境准备: 1.注册微博账号 2.注册应用
- pytorch模型存储的两种方式
1.保存整个网络结构信息和模型参数信息: torch.save(model_object, './model.pth') 直接加载即可使用: model = torch.load('./model.p ...
- ubuntu 关于curses头文件问题
执行编译gcc -o badterm badterm.c -lcurses后报错情报如下:term.h: 没有那个文件或目录curses.h: 没有那个文件或目录很明显,程序找不到term.h和cur ...
- Android开发之高仿微信图片选择器
记得刚开始做Andriod项目那会,经常会碰到一些上传图片的功能需求,特别是社交类的app,比如用户头像,说说配图,商品配图等功能都需要让我们到系统相册去选取图片,但官方却没有提供可以选取多张图片的相 ...
- 【431】Prim 算法 & Kruskal 算法
Prim 算法: Minimum Spanning Tree(MST):最小生成树,就是连接所有节点的最小权值 mst集合与rest集合 mst集合中顶点,找到一条最小权值的边 然后把边相关的顶点,选 ...
- 全基因组关联分析(GWAS):为何我的QQ图那么飘
前段时间有位小可爱问我,为什么她的QQ图特别飘,如果你不理解怎样算飘,请看下图: 理想的QQ图应该是这样的: 我当时的第一反应是:1)群体分层造成的:2)表型分布有问题.因此让她检查一下数据的群体分层 ...
- 123457123456#3#----com.ppGame.konglongPuzzle78--前拼后广--konglongPT游戏_pp
com.ppGame.konglongPuzzle78--前拼后广--konglongPT游戏_pp
- go micro 微服务框架温习
go mod edit -require="github.com/chromedp/chromedp@v0.1.0" @后面加上你需要的版本号.就可以 已经修改go.mod 里的依 ...
- 【计算机视觉】OpenCV篇(6) - 平滑图像(卷积/滤波/模糊/降噪)
平滑滤波 平滑滤波是低频增强的空间域滤波技术.空间域滤波技术即不经由傅立叶转换,直接处理影像中的像素,它的目的有两类:一类是模糊:另一类是消除噪音.空间域的平滑滤波一般采用简单平均法进行,就是求邻近像 ...
- 正确删除k8s版本jenkins的pod
1.kubectl delete -f jenkins-deployment.yaml 或者先删除pod,再删除对应的depllyment 这两步都要执行否则删除pod不管用 2.删除数据目录下的数据 ...