类库:

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Linq.Expressions;
  5. using System.Text;
  6. namespace Mvc.Util
  7. {
  8. public class ParameterRebinder : ExpressionVisitor
  9. {
  10. private readonly Dictionary<ParameterExpression, ParameterExpression> map;
  11. public ParameterRebinder(Dictionary<ParameterExpression, ParameterExpression> map)
  12. {
  13. this.map = map ?? new Dictionary<ParameterExpression, ParameterExpression>();
  14. }
  15. public static Expression ReplaceParameters(Dictionary<ParameterExpression, ParameterExpression> map, Expression exp)
  16. {
  17. return new ParameterRebinder(map).Visit(exp);
  18. }
  19. protected override Expression VisitParameter(ParameterExpression p)
  20. {
  21. ParameterExpression replacement;
  22. if (map.TryGetValue(p, out replacement))
  23. {
  24. p = replacement;
  25. }
  26. return base.VisitParameter(p);
  27. }
  28. }
  29. public static class LambdaHelper
  30. {
  31. public static Expression<T> Compose<T>(this Expression<T> first, Expression<T> second, Func<Expression, Expression, Expression> merge)
  32. {
  33. var map = first.Parameters.Select((f, i) => new { f, s = second.Parameters[i] }).ToDictionary(p => p.s, p => p.f);
  34. var secondBody = ParameterRebinder.ReplaceParameters(map, second.Body);
  35. return Expression.Lambda<T>(merge(first.Body, secondBody), first.Parameters);
  36. }
  37. public static Expression<Func<T, bool>> And<T>(this Expression<Func<T, bool>> first, Expression<Func<T, bool>> second)
  38. {
  39. return first.Compose(second, Expression.And);
  40. }
  41. public static Expression<Func<T, bool>> Or<T>(this Expression<Func<T, bool>> first, Expression<Func<T, bool>> second)
  42. {
  43. return first.Compose(second, Expression.Or);
  44. }
  45. }
  46. }

使用方法1:

  1. TyMall.Entity.DbEntities db = new DbEntities();
  2. Expression<Func<tb_advert, bool>> expression = t => true;
  3. expression = expression.And(t => t.id == 1);
  4. expression = expression.And(t => t.sort > 1);
  5. var rs=db.tb_advert.Where(expression);

使用方法2:

    1. static void Main(string[] args)
    2. {
    3. //模拟数据源
    4. List<Preson> l = new List<Preson>();
    5. for (int i = 1; i <= 100; i++) {
    6. Preson p = new Preson();
    7. p.id = i;
    8. p.age = i;
    9. l.Add(p);
    10. }
    11. //定义表达式
    12. Expression<Func<Preson, bool>> ex = t => true;
    13. ex = ex.And(t => t.id >30);
    14. ex = ex.And(t => t.age > 25);
    15. ex = ex.And(t => t.age < 35);
    16. //查询  注意:AsQueryable
    17. var rs =l.AsQueryable().Where(ex).ToList(); ;
    18. foreach(Preson p in rs){
    19. Console.WriteLine(p.id);
    20. }
    21. Console.Read();
    22. }

lambda 表达式拼接的更多相关文章

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

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

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

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

  3. 动态拼接lambda表达式树

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

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

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

  5. 19、lambda表达式树

    一.定义: 表达式树又称为表达式目录树,以数据形式表示语言级代码.所有的数据都存储在树结构中,每个结点表示一个表达式(Expression). 二.要点: –Lambda表达式的参数类型可以忽略,因为 ...

  6. java lambda表达式学习笔记

    lambda是函数式编程(FP,functional program),在java8中引入,而C#很早之前就有了.在java中lambda表达式是'->',在C#中是‘=>’. 杜甫说:射 ...

  7. 动态生成C# Lambda表达式

    转载:http://www.educity.cn/develop/1407905.html,并整理! 对于C# Lambda的理解我们在之前的文章中已经讲述过了,那么作为Delegate的进化使用,为 ...

  8. Lambda表达式的面纱(一)

    在.NET3.0版本中微软推出了Lambda表达式.这使代码的表述可以更加优雅.但是对于新事物大多会本能的排斥,虽然3.0版本已经推出了好久了,但是我向周围的人了解了一下,用Lambda的人不是很多, ...

  9. java 8 中lambda表达式学习

    转自 http://blog.csdn.net/renfufei/article/details/24600507 http://www.jdon.com/idea/java/10-example-o ...

随机推荐

  1. 壁虎书2 End-to-End Machine Learning Project

    the main steps: 1. look at the big picture 2. get the data 3. discover and visualize the data to gai ...

  2. 汇编语言里 eax, ebx, ecx, edx, esi, edi, ebp, esp

    eax, ebx, ecx, edx, esi, edi, ebp, esp等都是X86 汇编语言中CPU上的通用寄存器的名称,是32位的寄存器.如果用C语言来解释,可以把这些寄存器当作变量看待. 比 ...

  3. linux 下安装 redis

    https://redis.io/ 1.下载 $ cd /usr/local/ $ wget http://download.redis.io/releases/redis-4.0.7.tar.gz ...

  4. ubuntu下pig报错ERROR 2999: Unexpected internal error. Failed to create DataStorage的解决

    2019-03-04 00:10:03,998 [main] ERROR org.apache.pig.Main - ERROR 2999: Unexpected internal error. Fa ...

  5. ubuntu下安装bin文件

    从Java官网下载的安装文件,有的只有bin文件,没有.tar.gz文件. ①进入设备终端,通过sudo -s或su回车,切换到管理员用户:②输入管理员密码然后回车:③输入sudo chmod +x ...

  6. Codeforces 44E - Anfisa the Monkey - [水题]

    题目链接:http://codeforces.com/problemset/problem/44/E 题意: 给一个字符串,让你分割成 $k$ 行,每行的字母数在 $[a,b]$ 之间. 题解: 这是 ...

  7. php值callback类型和匿名函数(闭包)

    callback.callable类型 自PHP5.4起可以使用callable类型制定回调类型callback. 本文档基于同样理由使用callback类型信息. 一些函数如call_user_fu ...

  8. dispatch_barrier_async,加锁

    dispatch_barrier_async用于文件读写,在写的时候,不允许进行读操作,在写操作完成才能进行读取操作,为了保证线程安全 加锁的方式: 1. barrier 2. NSLock 3. @ ...

  9. scala-数组/列表

    import scala.collection.mutable.ArrayBuffer var ary=Array(1,2,3) println(ary.mkString) println(ary(1 ...

  10. java 选择排序、冒泡排序、折半查找

    public class SortAndSelectDemo{ public static void main(String[] args){ int[] arr = {3, 5, 17, 2, 11 ...