最近比较闲,年底了,项目也进入尾声;每天就是维护一下系统,整理整理文档,整理知识点,这样才觉得有点意思;

问题

在使用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表达式动态组装查询条件的更多相关文章

  1. LINQ to SQL 运行时动态构建查询条件

    在进行数据查询时,经常碰到需要动态构建查询条件.使用LINQ实现这个需求可能会比以前拼接SQL语句更麻烦一些.本文介绍了3种运行时动态构建查询条件的方法.本文中的例子最终实现的都是同一个功能,从Nor ...

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

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

  3. mybatis 使用记录(二) 动态拼接查询条件

    2016-12-16 阅读项目代码时,在项目的xml文件中发现如下写法: SELECT student_user_id FROM tbr_student_class WHERE 1=1 <if ...

  4. 动态创建Lambda表达式实现高级查询

    需求简介 最近这几天做的东西总算是回归咱的老本行了,给投资管理项目做一个台账的东西,就是类似我们的报表.其 中有一个功能是一个高级查询的需求,在查询条件方面大概有7.8个查询条件.需求就是如果一个条件 ...

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

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

  6. C#高级知识点概要(3) - 特性、自动属性、对象集合初始化器、扩展方法、Lambda表达式和Linq查询

    1.特性(Attributes) 特性(Attributes),MSDN的定义是:公共语言运行时允许你添加类似关键字的描述声明,叫做attributes, 它对程序中的元素进行标注,如类型.字段.方法 ...

  7. LINQ查询表达式详解(1)——基本语法、使用扩展方法和Lambda表达式简化LINQ查询

    简介 使用线程的主要原因:应用程序中一些操作需要消耗一定的时间,比如对文件.数据库.网络的访问等等,而我们不希望用户一直等待到操作结束,而是在此同时可以进行一些其他的操作.  这就可以使用线程来实现. ...

  8. 通过LINQ表达式树动态构建查询条件

    第一种方法: public static class PredicateExtensions { public static Expression<Func<T, bool>> ...

  9. Lambda 表达式动态拼接.

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

随机推荐

  1. std::setw(size)与std::setfill(char)

    头文件:#include <iostream>#include <iomanip>using namespace std; 功能:  std::setw :需要填充多少个字符, ...

  2. IDEA 配置热更新

  3. javascript中创建对象的方式及优缺点(二)

    一.工厂模式 流程: 定义一个函数,函数返回对象. 适用场景: 需要创建多个对象,都是Object类型. 优点:完成了返回一个对象的要求. 缺点: 对象没有一个具体的类型,无法通过constructo ...

  4. jQuery_CSS类操作

    下面讲述jQuery操作css类,进行类的添加,移除,以及前两项功能的结合操作. <!DOCTYPE html> <html> <head> <meta ch ...

  5. Centos6.6 安装Mysql集群

    一.环境准备 1.1系统IP设置 准备三台服务器安装Centos6.6 64位操作系统,IP地址及角色分配如下: Node                 IP Address            ...

  6. Jmeter -- 监听 -- 查看每个请求的启动时间等信息

    步骤: 1. 添加监听器 Add --> Listener --> View Results in Table 2. 执行线程组,查看监听信息

  7. Applink使用原理解析

    简介 通过 Link这个单词我们可以看出这个是一种链接,使用此链接可以直接跳转到 APP,常用于应用拉活,跨应用启动,推送通知启动等场景. 流程 在AS 上其实已经有详细的使用步骤解析了,这里给大家普 ...

  8. vue跳转到指定位置

    document.querySelector(id).scrollIntoView(true)//跳转到顶部 window.scrollTo(0, 0)

  9. Hibernate动态条件查询(Criteria Query)

    1.创建一个Criteria实例net.sf.hibernate.Criteria这个接口代表对一个特定的持久化类的查询.Session是用来制造Criteria实例的工厂. Criteria cri ...

  10. js创建对象的6种方式总结

    1.new 操作符 + Object 创建对象 var person = new Object(); person.name = "lisi"; person.age = 21; ...