lambda 表达式拼接

类库:

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



使用方法1:

[csharp] view plain copy
 
  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:

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