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

问题

在使用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. LOJ-6285-数列分块入门9

    链接: https://loj.ac/problem/6285 题意: 给出一个长为 的数列,以及 个操作,操作涉及询问区间的最小众数. 思路: vector维护每个值的出现位置, 预处理第i快到第j ...

  2. 在神经网络中weight decay

    weight decay(权值衰减)的最终目的是防止过拟合.在损失函数中,weight decay是放在正则项(regularization)前面的一个系数,正则项一般指示模型的复杂度,所以weigh ...

  3. Angular 应用的外壳

    你首先需要使用 Angular CLI 来创建一个初始化的应用.随后,你将对你已经初始化的应用进行修改来让你构建出 Tour of Heroes app(英雄指南) 这个应用. 在教程的本部分,你需要 ...

  4. 论文阅读:OpenFlow: Enabling Innovation in Campus Networks

    摘要: 本白皮书提出了OpenFlow——研究人员在他们每天使用的网络中运行实验协议的一种方式. OpenFlow基于以太网交换机,具有内部流表以及用于添加和删除流条目的标准化接口.我们的目标是鼓励网 ...

  5. 初始化spark

    初始化SparkContext 一.初始化sparkimport org.apache.spark.SparkConf;import org.apache.spark.api.java.JavaSpa ...

  6. 我不熟悉的set

    同样的我着重介绍那些我不怎么用到的系列,同时,常用的我就点一下. 我们都知道set底层是用红黑树实现的,红黑树是一种已排序的树,所以我们通过迭代器来访问节点元素的时候,并不可以改变它,如果随意改变,那 ...

  7. ar9331修改flash大小和df、cat /proc/mtd的区别

    首先感谢黄工的指导. 在openwrt固件目录下target/linux/ar71xx/image/Makefile,找到对应的机型,修改为4M,8M,16M,32M. 以oolite机型为例,如图所 ...

  8. 原生Js_使用setInterval() 方法实现图片轮播功能

    用javascript图片轮播功能 <!DOCTYPE html> <html> <head> <meta charset="utf-8" ...

  9. python 生成随机数的几种方法

      随机取一个: import random random.choice(string.digits)#从数字里随机选取一位数字: 随机取多位数:   random.sample(string.dig ...

  10. Java JDBC 基础

    JDBC API 包含以下几个核心部分: 1:JDBC 驱动 2:Connections (连接) 3:Statements (声明) 4:Result Sets (结果集) JDBC: 打开数据库连 ...