zoukankan      html  css  js  c++  java
  • 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. }  
  • 相关阅读:
    如何打开指定文件所在的文件夹并选中文件
    不阻止多线程中控件跨线程访问
    .NET使用并行计算 提高执行效率
    关于线程安全中Lock的一些说明
    多线程中调用多参数的方法
    C#把汉字转换成拼音
    跨窗体Invoke时使用匿名方法或者带参方法
    给MP3音乐文件写ID3信息和专辑封面
    用Python作GIS:菜谱篇
    python中对象self的由来
  • 原文地址:https://www.cnblogs.com/waw/p/8395093.html
Copyright © 2011-2022 走看看