动态构造Lambda表达式

时间:2021-12-12 18:49:42

环境:Visual Studio2008 .NET Framework3.5

场合:查询条件不确定,需动态生成

动态构造代码:

 1 动态构造Lambda表达式动态构造Lambda表达式     /// <summary>
 2动态构造Lambda表达式    /// 动态构造Lambda表达式
 3动态构造Lambda表达式    /// </summary>
 4动态构造Lambda表达式    /// <typeparam name="T">查询目标实体</typeparam>

 5 动态构造Lambda表达式     public   class  ConstructLambda < T >   where  T :  class new ()
 6 动态构造Lambda表达式动态构造Lambda表达式     {
 7动态构造Lambda表达式        private Type TType;
 8动态构造Lambda表达式动态构造Lambda表达式        /// <summary>
 9动态构造Lambda表达式        /// 构造方法
10动态构造Lambda表达式        /// </summary>

11动态构造Lambda表达式        public ConstructLambda()
12动态构造Lambda表达式动态构造Lambda表达式        {
13动态构造Lambda表达式            TType = typeof(T);
14动态构造Lambda表达式        }

15动态构造Lambda表达式动态构造Lambda表达式        /// <summary>
16动态构造Lambda表达式        /// 构造与表达式
17动态构造Lambda表达式        /// </summary>
18动态构造Lambda表达式        /// <param name="dictionary">构造源</param>
19动态构造Lambda表达式        /// <returns>lambda表达式</returns>

20动态构造Lambda表达式        public Expression<Func<T, bool>> GetAndLambdaExpression(Dictionary<stringstring> dictionary)
21动态构造Lambda表达式动态构造Lambda表达式        {
22动态构造Lambda表达式            Expression expression_return = Expression.Constant(true);
23动态构造Lambda表达式            ParameterExpression expression_param = Expression.Parameter(TType, "p");
24动态构造Lambda表达式            foreach (string key in dictionary.Keys)
25动态构造Lambda表达式动态构造Lambda表达式            {
26动态构造Lambda表达式                Expression temp = Expression.Equal(Expression.Call(Expression.Property(expression_param, TType.GetProperty(key)), TType.GetMethod("ToString")),
27动态构造Lambda表达式                    Expression.Constant(dictionary[key]));
28动态构造Lambda表达式                expression_return = Expression.And(expression_return, temp);
29动态构造Lambda表达式            }

30动态构造Lambda表达式动态构造Lambda表达式            return (Expression<Func<T, bool>>)Expression.Lambda<Func<T, bool>>(expression_return, new ParameterExpression[] { expression_param });
31动态构造Lambda表达式        }

32动态构造Lambda表达式
33动态构造Lambda表达式动态构造Lambda表达式        /// <summary>
34动态构造Lambda表达式        /// 构造或表达式
35动态构造Lambda表达式        /// </summary>
36动态构造Lambda表达式        /// <param name="dictionary">构造源</param>
37动态构造Lambda表达式        /// <returns>Lambda表达式</returns>

38动态构造Lambda表达式        public Expression<Func<T, bool>> GetOrLambdaExpression(Dictionary<stringstring> dictionary)
39动态构造Lambda表达式动态构造Lambda表达式        {
40动态构造Lambda表达式            Expression expression_return = Expression.Constant(false);
41动态构造Lambda表达式            ParameterExpression expression_param = Expression.Parameter(TType, "p");
42动态构造Lambda表达式            foreach (string key in dictionary.Keys)
43动态构造Lambda表达式动态构造Lambda表达式            {
44动态构造Lambda表达式                Expression temp = Expression.Equal(Expression.Call(Expression.Property(expression_param, TType.GetProperty(key)), TType.GetMethod("ToString")),
45动态构造Lambda表达式                    Expression.Constant(dictionary[key]));
46动态构造Lambda表达式                expression_return = Expression.Or(expression_return, temp);
47动态构造Lambda表达式            }

48动态构造Lambda表达式动态构造Lambda表达式            return (Expression<Func<T, bool>>)Expression.Lambda<Func<T, bool>>(expression_return, new ParameterExpression[] { expression_param });
49动态构造Lambda表达式        }

50 动态构造Lambda表达式


实例:
测试数据:
        虚拟实体:

动态构造Lambda表达式     public   class  Person
动态构造Lambda表达式动态构造Lambda表达式    
{
动态构造Lambda表达式动态构造Lambda表达式        
public string Name getset; }
动态构造Lambda表达式动态构造Lambda表达式        
public string Sex getset; }
动态构造Lambda表达式动态构造Lambda表达式        
public int Age getset; }
动态构造Lambda表达式动态构造Lambda表达式        
public DateTime Birthday getset; }
动态构造Lambda表达式
动态构造Lambda表达式        
public Person()
动态构造Lambda表达式动态构造Lambda表达式        
{ }
动态构造Lambda表达式    }

动态构造Lambda表达式

      虚拟查找源:

动态构造Lambda表达式         private  Dictionary < string string >  dictionary  =   new  Dictionary < string string > () 
动态构造Lambda表达式动态构造Lambda表达式        
{
动态构造Lambda表达式动态构造Lambda表达式            
{"Name","JT"},{"Sex",""},{"Age","20"},{"Birthday","02/02/2008"}
动态构造Lambda表达式        }
;
动态构造Lambda表达式


 1,无条件查找:    
new ConstructLambda<Person>().GetAndLambdaExpression(new Dictionary<string, string>()).ToString()返回结果:
p => True

  new ConstructLambda<Person>().GetOrLambdaExpression(new Dictionary<string, string>()).ToString()返回结果:
p => False
 2,多条件查找:
  new ConstructLambda<Person>().GetAndLambdaExpression(dictionary).ToString()返回结果:
p => ((((True And (p.Name.ToString() = "JT")) And (p.Sex.ToString() = "男")) And (p.Age.ToString() = "20")) And (p.Birthday.ToString() = "02/02/2008"))

  new ConstructLambda<Person>().GetOrLambdaExpression(dictionary).ToString()返回结果:
p => ((((False Or (p.Name.ToString() = "JT")) Or (p.Sex.ToString() = "男")) Or (p.Age.ToString() = "20")) Or (p.Birthday.ToString() = "02/02/2008"))

动态构造Lambda表达式            // 构造常量表达式
动态构造Lambda表达式
            Expression expression_return  =  Expression.Constant( true );
动态构造Lambda表达式            
// 构造表达式参数  类似于p=>动态构造Lambda表达式动态构造Lambda表达式 中的p
动态构造Lambda表达式
            ParameterExpression expression_param  =  Expression.Parameter(TType,  " p " );
动态构造Lambda表达式            
// 遍历所有关键词 生成查询条件
动态构造Lambda表达式
             foreach  ( string  key  in  dictionary.Keys)
动态构造Lambda表达式动态构造Lambda表达式            
{
动态构造Lambda表达式                
//生成类似与“p.Name.ToString()==常量”的表达式
动态构造Lambda表达式
                Expression temp = Expression.Equal(
动态构造Lambda表达式                    
//后面两行先用.Property 得到p.Name 然后用call得到p.Name.ToString();
动态构造Lambda表达式
                    Expression.Call(
动态构造Lambda表达式                    Expression.Property(expression_param, TType.GetProperty(key)),TType.GetMethod(
"ToString")),
动态构造Lambda表达式                    Expression.Constant(dictionary[key]));
动态构造Lambda表达式                
//合并查询条件
动态构造Lambda表达式
                expression_return = Expression.And(expression_return, temp);
动态构造Lambda表达式            }

原创文章,转载请注明出处!
All CopyRight Reserved !

 

主页:http://jingtao.cnblogs.com

QQ:307073463
Email:jingtaodeemail@qq.com
MSN:sunjingtao@live.com