背景:

项目使用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 表达式动态拼接.的更多相关文章

  1. Lambda表达式动态拼接(备忘)

    EntityFramework动态组合Lambda表达式作为数据筛选条件,代替拼接SQL语句 分类: C# Lambda/Linq Entity Framework 2013-05-24 06:58 ...

  2. Lambda表达式公共拼接函数(原创)

    #region Lambda公共拼接函数 /// <summary> /// LambdaWhere(枚举) /// </summary> public enum Lambda ...

  3. Lambda表达式动态组装查询条件

    最近比较闲,年底了,项目也进入尾声:每天就是维护一下系统,整理整理文档,整理知识点,这样才觉得有点意思: 问题 在使用Linq的where()查询的时候,不知道大家是怎么动态组装多个查询条件时,是怎么 ...

  4. el表达式动态拼接变量_c:set的用法

    转自:https://blog.csdn.net/xb12369/article/details/39581955如 何在${}中使用${},例:${user.name_${user.id}},use ...

  5. 动态LINQ(Lambda表达式)构建

    using System; using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; us ...

  6. Lambda 表达式 是 个 好东东

    Lambda 表达式 是 个 好东东 首先,通过 Lambda 表达式 + 动态语言特性 dynamic , C# 已经 可以 实现 函数式 编程 了 其次, 利用 Lambda, 可以 实现 AOP ...

  7. 表达式树动态拼接lambda

    动态拼接lambda表达式树   前言 最近在优化同事写的代码(我们的框架用的是dapperLambda),其中有一个这样很普通的场景——界面上提供了一些查询条件框供用户来进行过滤数据.由于dappe ...

  8. 动态拼接lambda表达式树

    前言 最近在优化同事写的代码(我们的框架用的是dapperLambda),其中有一个这样很普通的场景——界面上提供了一些查询条件框供用户来进行过滤数据.由于dapperLambda按条件查询时是传入表 ...

  9. 【转】EntityFramework动态组合Lambda表达式作为数据筛选条件,代替拼接SQL语句

    传统的操作数据库方式,筛选数据需要用StringBuilder拼接一大堆的WHERE子句. 在Entity Framework中,代码稍有不慎就会造成巨大性能消耗,如: using(var db=ne ...

随机推荐

  1. peomethues 参数设置 监控网站 /usr/local/prometheus-2.13.0.linux-amd64/prometheus --config.file=/usr/local/prometheus-2.13.0.linux-amd64/prometheus.yml --web.listen-address=:9999 --web.enable-lifecycle

    probe_http_status_code{instance="xxxx",job="web_status"} probe_http_status_code{ ...

  2. Java对象为啥要实现Serializable接口

    Serializable接口概述 Serializable是java.io包中定义的.用于实现Java类的序列化操作而提供的一个语义级别的接口.Serializable序列化接口没有任何方法或者字段, ...

  3. eclipse连接夜神模拟器方法

    用eclipse 进行安卓开发的时候我们会遇到安卓自带的模拟器启动时间过长,反应慢等的问题,这个时候我们就希望使用别的安卓模拟器,而我自己喜欢使用夜神模拟器.1.首先我们启动eclipse 和夜神模拟 ...

  4. Tomcat清理无用应用防止漏洞

    /webapps/host-manager /home/renguoqiang /webapps/manager /home/renguoqiang /webapps/host-manager rm ...

  5. Docs-.NET-C#-指南-语言参考-关键字-值类型-:浮点数值类型

    ylbtech-Docs-.NET-C#-指南-语言参考-关键字-值类型-:浮点数值类型 1.返回顶部 1. 浮点数值类型(C# 引用) 2019/10/22 “浮点类型”是“简单类型”的子集,可以使 ...

  6. ISO/IEC 9899:2011 条款6.5.16——赋值操作符

    6.5.16 赋值操作符 语法 1.assignment-expression: conditional-expression unary-expression    assignment-opera ...

  7. Influxdb修改数据保留策略

    retention policy: 存储策略,用于设置数据保留的时间,每个数据库刚开始会自动创建一个默认的存储策略 autogen,数据保留时间为永久,之后用户可以自己设置,例如保留最近2小时的数据. ...

  8. 报错:MetaException(message:Version information not found in metastore. )

    报错背景: CDH安装完成hive后启动失败. 报错现象: [main]: Metastore Thrift Server threw an exception... MetaException(me ...

  9. POJ 3903 Stock Exchange 最长上升子序列入门题

    题目链接:http://poj.org/problem?id=3903 最长上升子序列入门题. 算法时间复杂度 O(n*logn) . 代码: #include <iostream> #i ...

  10. LODOP的ADD_PRINT_TABLE中不能总计在最后一页显示在tfoot后面

    ADD_PRINT_TABLE有计算功能,还会每页显示tfoot和thead里的内容.相关其他博文:如果一个表格既有需要每页显示的tfoot,还有一个总计功能,想显示在最后一页的tfoot后面,是不行 ...