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 ...
随机推荐
- sass - &的作用
6.8. & in SassScript 就像在选择器中使用时一样,&在SassScript中引用当前父选择器.它是一个逗号分隔的列表和空格分隔的列表.例如: .foo.bar .ba ...
- vim脚本判断操作系统
Linux 和 Windows 通用配置 其实在配置文件中是可以通过逻辑代码判断平台做条件处理的,这样就可以实现一个配置文件两个个平台下共用了,判断逻辑如下: " ============= ...
- Java基础 println 输出常量的示例
JDK :OpenJDK-11 OS :CentOS 7.6.1810 IDE :Eclipse 2019‑03 typesetting :Markdown code ...
- Flutter 中SimpleDialog简单弹窗使用
import 'package:flutter/material.dart'; import 'dart:async'; enum Option { A, B, C } class SimpleDia ...
- 使用SoapUI发送Post请求
https://www.cnblogs.com/xiaowangzi1110/p/8544264.html 使用SoapUI发送Post请求 SoapUI作为一个开源的工具,其具备强大的功能.易用的界 ...
- Linux下文件乱码问题
通常编码会在windows环境下进行,当把windows下的代码拷贝到linux环境时,会出现 error: “build.sh /bin/bash^M: 坏的解释器:没有那个文件或目录” 等等类似问 ...
- Qt编写气体安全管理系统20-控制器管理
一.前言 控制器管理,主要就是对控制器进行添加删除和修改,其中包括编号.端口名称.控制器名称.控制器地址.控制器型号.探测器数量这几个字段,端口名称表示当前控制器所属哪个端口,一个系统中可以有好多个端 ...
- GWAS: 网页版的基因型填充(genotype imputation)
在全基因组关联分析中,处理芯片数据时,必须走的一个流程就是基因型数据填充(imputation). 当然,如果你拿到的是全测序的数据,请忽略这一步. 下面直奔主题,怎么在网页版进行基因型填充. 1 进 ...
- ubuntu14.0.4安装kafka
1. 下载 zookeeper-3.4.12 zookeeper download 2 配置Zookeeper 进入 zookeeper 的 conf 目录下,找到 zoo_sample.cfg 文件 ...
- Win10安装Golang
首先去这个网站下载Golang的安装包:https://studygolang.com/dl 因为我的系统是Win10专业版64位,所以我选择了对应的Windows的安装包进行下载: 下载好安装包之后 ...