Lambda表达式动态组装查询条件
最近比较闲,年底了,项目也进入尾声;每天就是维护一下系统,整理整理文档,整理知识点,这样才觉得有点意思;
问题
在使用Linq的where()查询的时候,不知道大家是怎么动态组装多个查询条件时,是怎么做的?我是这样做的,请看下面代码;
方法一:
1.1 Expression的扩展类
public static class PredicateExtensions
{
public static Expression<Func<T, bool>> True<T>() { return f => true; } public static Expression<Func<T, bool>> False<T>() { return f => false; } public static Expression<Func<T, bool>> Or<T>(this Expression<Func<T, bool>> expression1, Expression<Func<T, bool>> expression2)
{
var invokedExpression = Expression.Invoke(expression2, expression1.Parameters.Cast<Expression>()); return Expression.Lambda<Func<T, bool>>(Expression.Or(expression1.Body, invokedExpression), expression1.Parameters);
} public static Expression<Func<T, bool>> And<T>(this Expression<Func<T, bool>> expression1, Expression<Func<T, bool>> expression2)
{ var invokedExpression = Expression.Invoke(expression2, expression1.Parameters.Cast<Expression>());//将一个委托或lambda表达式应用于参数表达式列表。 return Expression.Lambda<Func<T, bool>>(Expression.And(expression1.Body, invokedExpression), expression1.Parameters);
}
}
1.2 实例化代码
List<string> strList = new List<string>() { "郑州","上海户口", "鲁山揽锅菜", "南京酸菜鱼" };
//传统写法
Func<string, bool> func = (t) => t.Length > 3&&t.Contains("鱼");
var listA=strList.Where(func).ToList();
//使用扩展写法
var expression=PredicateExtensions.True<string>();
expression = expression.And(t => t.Length > 3);
expression = expression.And(t => t.Contains("鱼"));
var predicate = expression.Compile();
var listB = strList.Where(predicate).ToList();
方法二:合并两个Expression表达式
2.1 表达式参数扩展类
public class MyExpressionVisitor:ExpressionVisitor
{
private readonly ParameterExpression _parameter; public MyExpressionVisitor(ParameterExpression parameter)
{
_parameter = parameter;
} public ParameterExpression Parameter
{
get { return _parameter; }
} public Expression Nodify(Expression exp)
{
Expression e = this.Visit(exp);
return e;
} protected override Expression VisitParameter(ParameterExpression node)
{
return _parameter;
} }
2.2 实例化代码
int[] numbers = { 19, 25, 6, 8, 49, 7, 8, 0, 1, 47, 35, 30,29 };
//表达式一
ParameterExpression leftPara = Expression.Parameter(typeof(int), "n");
Expression a_con = Expression.Constant(13);
BinaryExpression a_binary = Expression.GreaterThan(leftPara, a_con);
var a_lambda = Expression.Lambda<Func<int, bool>>(a_binary,leftPara);
var a_result = a_lambda.Compile();
var a_list = numbers.Where(a_result).ToList();
//表达式二
ParameterExpression b_leftPara = Expression.Parameter(typeof(int), "n");
Expression b_con = Expression.Constant(30);
BinaryExpression b_binary = Expression.LessThanOrEqual(b_leftPara, b_con);
var b_lambda = Expression.Lambda<Func<int, bool>>(b_binary, b_leftPara);
var b_result = b_lambda.Compile();
var b_list = numbers.Where(b_result).ToList();
//合并两个表达式
var vistor = new MyExpressionVisitor(leftPara);
Expression c_1 = vistor.Nodify(a_lambda.Body);
Expression c_2 = vistor.Nodify(b_lambda.Body);
BinaryExpression c_binary = Expression.AndAlso(c_1, c_2);
var c_lambda = Expression.Lambda<Func<int, bool>>(c_binary, leftPara);
var c_result = c_lambda.Compile();//编译表达式
var c_list = numbers.Where(c_result).ToList();
方法二有点啰嗦,当时是用表达式树来创建的;大家可以用匿名表达式简单一点。但是在合并表达式的逻辑是,重新更改了一下表达式一和表达式二的参数,这样在编译的时候就可以通过了。
写的不咋样,日日精进吧。。。。
Lambda表达式动态组装查询条件的更多相关文章
- LINQ to SQL 运行时动态构建查询条件
在进行数据查询时,经常碰到需要动态构建查询条件.使用LINQ实现这个需求可能会比以前拼接SQL语句更麻烦一些.本文介绍了3种运行时动态构建查询条件的方法.本文中的例子最终实现的都是同一个功能,从Nor ...
- Lambda表达式动态拼接(备忘)
EntityFramework动态组合Lambda表达式作为数据筛选条件,代替拼接SQL语句 分类: C# Lambda/Linq Entity Framework 2013-05-24 06:58 ...
- mybatis 使用记录(二) 动态拼接查询条件
2016-12-16 阅读项目代码时,在项目的xml文件中发现如下写法: SELECT student_user_id FROM tbr_student_class WHERE 1=1 <if ...
- 动态创建Lambda表达式实现高级查询
需求简介 最近这几天做的东西总算是回归咱的老本行了,给投资管理项目做一个台账的东西,就是类似我们的报表.其 中有一个功能是一个高级查询的需求,在查询条件方面大概有7.8个查询条件.需求就是如果一个条件 ...
- 【转】EntityFramework动态组合Lambda表达式作为数据筛选条件,代替拼接SQL语句
传统的操作数据库方式,筛选数据需要用StringBuilder拼接一大堆的WHERE子句. 在Entity Framework中,代码稍有不慎就会造成巨大性能消耗,如: using(var db=ne ...
- C#高级知识点概要(3) - 特性、自动属性、对象集合初始化器、扩展方法、Lambda表达式和Linq查询
1.特性(Attributes) 特性(Attributes),MSDN的定义是:公共语言运行时允许你添加类似关键字的描述声明,叫做attributes, 它对程序中的元素进行标注,如类型.字段.方法 ...
- LINQ查询表达式详解(1)——基本语法、使用扩展方法和Lambda表达式简化LINQ查询
简介 使用线程的主要原因:应用程序中一些操作需要消耗一定的时间,比如对文件.数据库.网络的访问等等,而我们不希望用户一直等待到操作结束,而是在此同时可以进行一些其他的操作. 这就可以使用线程来实现. ...
- 通过LINQ表达式树动态构建查询条件
第一种方法: public static class PredicateExtensions { public static Expression<Func<T, bool>> ...
- Lambda 表达式动态拼接.
背景: 项目使用EF 查询时需要手动判断条件写.觉得太麻烦就Google 如何动态生成Linq.最后找到了 System.Linq.Dynamic.Core. 这个东西. Scott Guthrie ...
随机推荐
- Mac的MySQL无法启动的原因
一.由于Mac OS X的升级或其他原因可能会导致一个错误: Warning:The /usr/local/mysql/data directory is not owned by the 'mysq ...
- Acwing-91-最短Hamilton路径(状压DP)
链接: https://www.acwing.com/problem/content/93/ 题意: 给定一张 n 个点的带权无向图,点从 0~n-1 标号,求起点 0 到终点 n-1 的最短Hami ...
- Python---函数参数---王伟
#### 定义函数 ```python#定义函数def function(): print("hello world")#调用函数function() #输出结果hello ...
- Python CGI编程Ⅷ
通过CGI程序传递checkbox数据 checkbox用于提交一个或者多个选项数据,HTML代码如下: 以下为 checkbox.py 文件的代码: 修改 checkbox.py 权限: 通过CGI ...
- python 可更改(mutable)与不可更改(immutable)对象
在 python 中,strings, tuples, 和 numbers 是不可更改的对象,而 list,dict 等则是可以修改的对象. 不可变类型:变量赋值 a=5 后再赋值 a=10,这里实际 ...
- 总结JavaScript中浏览器的兼容问题
浅析JavaScript中浏览器的兼容问题 浏览器兼容性问题是在实际开发中容易忽略而又最重要的一部分.我们在讲老版本浏览器兼容问题之前,首先要了解什么是能力检测,它是来检测浏览器有没有这种能力,即判断 ...
- Misplaced alignment tab character &
范例: 期望的标题效果:Literature review & Research set-up 在Latex里写的标题:\section{Literature Review & Res ...
- json转换时 java.lang.ClassNotFoundException: org.apache.commons.lang.exception.NestableRuntimeException
java.lang.ClassNotFoundException: org.apache.commons.lang.exception.NestableRuntimeException 遇到这种问题是 ...
- 品 SpringBootApplication 注解源码
@SpringBootApplication 由以下三个注解构成: @SpringBootConfiguration@EnableAutoConfiguration@ComponentScan 一:@ ...
- Linux Bash shell常用操作快捷键
转自:https://linuxtoy.org/archives/bash-shortcuts.html 生活在 Bash shell 中,熟记以下快捷键,将极大的提高你的命令行操作效率. 编辑命令 ...