博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
lambda 表达式拼接
阅读量:5806 次
发布时间:2019-06-18

本文共 2353 字,大约阅读时间需要 7 分钟。

类库:

 

[csharp] 
 
 
  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] 
 
 
  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] 
 
 
    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

你可能感兴趣的文章
又拍云沈志华:如何打造一款安全的App
查看>>
dubbo源码分析-架构
查看>>
Windows phone 8 学习笔记
查看>>
我的友情链接
查看>>
sshd_config设置参数笔记
查看>>
LeetCode--112--路径总和
查看>>
感悟贴2016-05-13
查看>>
百度编辑器ueditor 光标位置的坐标
查看>>
DEV-C++ 调试方法简明图文教程(转)
查看>>
参加婚礼
查看>>
Java重写equals方法和hashCode方法
查看>>
Spark API编程动手实战-07-join操作深入实战
查看>>
EasyUI基础入门之Easyloader(载入器)
查看>>
Spring ’14 Wave Update: Installing Dynamics CRM on Tablets for Windows 8.1
查看>>
MySQL 备份与恢复
查看>>
TEST
查看>>
PAT A1037
查看>>
ReactiveSwift源码解析(三) Signal代码的基本实现
查看>>
(六)Oracle学习笔记—— 约束
查看>>
[Oracle]如何在Oracle中设置Event
查看>>