• [织梦吧]唯一域名:www.dedecms8.com,织梦DedeCMS学习平台.

当前位置: > 编程与数据库 > net编程 >

动态构造Lambda表达式

来源: www.dedecms8.com 编辑:织梦吧 时间:2012-06-27点击:

 环境:Visual Studio2008 .NET Framework3.5

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

动态构造代码:

1    /**//// <summary>
2    /// 动态构造Lambda表达式
3    /// </summary>
4    /// <typeparam name="T">查询目标实体</typeparam>
5    public class ConstructLambda<T> where T : class, new()
6    {
7        private Type TType;
8        /**//// <summary>
9        /// 构造方法
10        /// </summary>
11        public ConstructLambda()
12        {
13            TType = typeof(T);
14        }
15        /**//// <summary>
16        /// 构造与表达式
17        /// </summary>
18        /// <param name="dictionary">构造源</param>
19        /// <returns>lambda表达式</returns>
20        public Expression<Func<T, bool>> GetAndLambdaExpression(Dictionary<string, string> dictionary)
21        {
22            Expression expression_return = Expression.Constant(true);
23            ParameterExpression expression_param = Expression.Parameter(TType, "p");
24            foreach (string key in dictionary.Keys)
25            {
26                Expression temp = Expression.Equal(Expression.Call(Expression.Property(expression_param, TType.GetProperty(key)), TType.GetMethod("ToString")),
27                    Expression.Constant(dictionary[key]));
28                expression_return = Expression.And(expression_return, temp);
29            }
30            return (Expression<Func<T, bool>>)Expression.Lambda<Func<T, bool>>(expression_return, new ParameterExpression[] { expression_param });
31        }
32
33        /**//// <summary>
34        /// 构造或表达式
35        /// </summary>
36        /// <param name="dictionary">构造源</param>
37        /// <returns>Lambda表达式</returns>
38        public Expression<Func<T, bool>> GetOrLambdaExpression(Dictionary<string, string> dictionary)
39        {
40            Expression expression_return = Expression.Constant(false);
41            ParameterExpression expression_param = Expression.Parameter(TType, "p");
42            foreach (string key in dictionary.Keys)
43            {
44                Expression temp = Expression.Equal(Expression.Call(Expression.Property(expression_param, TType.GetProperty(key)), TType.GetMethod("ToString")),
45                    Expression.Constant(dictionary[key]));
46                expression_return = Expression.Or(expression_return, temp);
47            }
48            return (Expression<Func<T, bool>>)Expression.Lambda<Func<T, bool>>(expression_return, new ParameterExpression[] { expression_param });
49        }
50

 

实例:

测试数据:

虚拟实体:

public class Person
{
public string Name { get; set; }
public string Sex { get; set; }
public int Age { get; set; }
public DateTime Birthday { get; set; }
public Person()
{ }
}

虚拟查找源:

private Dictionary<string, string> dictionary = new Dictionary<string, string>() 
{
{"Name","JT"},{"Sex","男"},{"Age","20"},{"Birthday","02/02/2008"}
};

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()返回结果:

About D8

  • ©2014 织梦吧(d8) DedeCMS学习交流平台
  • 唯一网址 www.DedeCMS8.com 网站地图
  • 联系我们 1978130638@qq.com ,  QQ