转 动态创建Lambda表达式实现高级查询

 摘自:

http://blog.csdn.net/hao134838/article/details/51404151

 

摘部分:

 

   具体实现—小Demo

 

   首先需要引入命名空间


   using System.Linq.Expressions.Expression;

 

   

[csharp] view plain copy
 
 print?
    1. //创建一个数组用来当做例子  
    2.   
    3.   
    4.    var ints = new int []{ 1, 2 , 3 , 4 , 5 , 6 };  
    5.   
    6.   
    7.    // 要创建形如 i => i < 5  
    8.   
    9.   
    10.    //创建参数 i  
    11.   
    12.   
    13. var parameter  = Expression.Parameter(typeof(int),”i”);  
    14.   
    15.   
    16. //创建常数 5  
    17.   
    18.   
    19. var constant = Expression.Constant(5);  
    20.   
    21.   
    22. //创建 i > 5  
    23.   
    24.   
    25. var bin = Expression.GreaterThan(parameter,constant);  
    26.   
    27.   
    28. //获取Lambda表达式  
    29.   
    30.   
    31. var lambda=Expression.Lambda<Func<Int32,Boolean>>(bin,parameter);  
    32.   
    33.   
    34. //取得查询结果  
    35.   
    36.   
    37. var query = ints.Where(lambda.Compile());  

       

       

 

通过上面一个小Demo我们可以简单的看到动态创建Lambda表达式的雏形,下面在介绍一个比较复杂的例子。

 

 

[csharp] view plain copy
 
 print?
  1. BinaryExpression condition = null;  
  2.   
  3. //要构造的表达式i==1||i==2||i==3.....  
  4.   
  5. for (int i = 0; i < ints.Length; i++)  
  6.   
  7. {  
  8.   
  9.       ConstantExpression ce = Expression.Constant(i);  
  10.   
  11.       if (condition == null)  
  12.   
  13.       {  
  14.   
  15.            condition = Expression.Equal(parameter, ce);  
  16.   
  17.       }  
  18.   
  19.       else  
  20.   
  21.       {  
  22.   
  23.            var right = Expression.Equal(parameter, ce);  
  24.   
  25.            condition = Expression.Or(condition, right);  
  26.   
  27.       }  
  28.   
  29. }  
  30.   
  31. Expression<Func<Int32, Boolean>> lambda = Expression.Lambda<Func<Int32, Boolean>>(condition, parameter);  

 

 

   实体类的实现


   上面都是比较简单的小例子,但是在我们项目中都是来对实体进行条件查询的,所以呢小编在下面会给大家介

 

绍一下如何对实体类进行构造。

 

 

[csharp] view plain copy
 
 print?
  1. //p => p.Name == "1" && p.Address == "2"  
  2.   
  3.            ParameterExpression parameter1 = Expression.Parameter(typeof(Person), "p");  
  4.           
  5.     MemberExpression member1 = Expression.PropertyOrField(parameter1, "Name");  
  6.            
  7.     MemberExpression member2 =  Expression.PropertyOrField(parameter1, "Address"),  
  8.            
  9.            ConstantExpression constant1 = Expression.Constant("郑浩");  
  10.           
  11.            ConstantExpression constant2 = Expression.Constant("河北");  
  12.            
  13.         var query1 = Expression.Equal(member1, constant1);//Equal等于;GreaterThanOrEqual大于;LessThanOrEqual小于  
  14.   
  15.            var query2 = Expression.Equal(member2, constant2);  
  16.   
  17.            var query = Expression.And(query1, query2);//and 与;or或  
  18.   
  19.            var lambda1 = Expression.Lambda<Func<Person, Boolean>>(query, parameter1);  
  20.   
  21.            var list = MethodExtend.GetUser(lambda1.Compile());  



            代码介绍:

 

        1)创建表达式的开始部分:p=>

 

        2、3)创建我们要查询的字段:p.Name和p.Address

 

       4、5)给给变量赋值,这些值和变量可以任意匹配

 

       6、7)匹配查询条件和对应的值:p.Name=="郑浩";p.Address=="河北"

 

       8、9)连接查询条件;p.Name=="郑浩"&&p.Address=="河北"

 

       10)创建最后的查询条件:p=>p.Name=="郑浩"&&p.Address=="河北"

 

       11)最后执行查询条件

 

 

dfdf dfd

posted @ 2017-10-31 00:51  以函  阅读(102)  评论(0编辑  收藏  举报