zoukankan      html  css  js  c++  java
  • linq to sql 动态构建查询表达式树

    通过Expression类进行动态构造lamda表达式。

    实现了以下几种类型,好了代码说话:

    public Expression<Func<T, bool>> GetAndLambdaExpression<T>(string[] keys,object[] values,string[] methons)
    {

    Expression expression_return = Expression.Constant(true);
    Type TType = typeof(T);
    ParameterExpression expression_param = Expression.Parameter(TType, "p");
    Expression temp;
    for (int i = 0; i < keys.Length; i++)
    {
        switch (methons[i])
        {
            case "=":
                temp = Expression.Equal(Expression.Call(Expression.Property(expression_param, TType.GetProperty(keys[i])),
                    TType.GetMethod("ToString")),
                 Expression.Constant(values[i]));
                expression_return = Expression.And(expression_return, temp);
                break;
            case "%":
                temp = Expression.Call(Expression.Property(expression_param, TType.GetProperty(keys[i])),
                    typeof(string).GetMethod("Contains"),
                    Expression.Constant(values[i], typeof(string)));
                expression_return = Expression.And(expression_return, temp);
                break;
            case ">":
                //temp = Expression.Call(Expression.Property(expression_param, TType.GetProperty(keys[i])),
                //    TType.GetProperty(keys[i]).GetType().GetMethod("GreaterThan"), Expression.Constant(values[i]));
                temp = Expression.GreaterThan(Expression.Property(expression_param, TType.GetProperty(keys[i])), Expression.Constant(Convert.ToInt32(values[i])));
                expression_return = Expression.And(expression_return, temp);
                break;
            case "<":
                //temp = Expression.Call(Expression.Property(expression_param, TType.GetProperty(keys[i])),
                //   Expression.GetType().GetMethod("LessThan"), Expression.Constant(values[i]));
                temp=Expression.LessThan(Expression.Property(expression_param, TType.GetProperty(keys[i])), Expression.Constant(Convert.ToInt32(values[i])));
                expression_return = Expression.And(expression_return, temp);
                break;
            case ">=":
                //temp = Expression.Call(Expression.Property(expression_param, TType.GetProperty(keys[i])),
                //    TType.GetProperty(keys[i]).GetType().GetMethod("GreaterThanOrEqual"), Expression.Constant(values[i]));
                temp = Expression.GreaterThanOrEqual(Expression.Property(expression_param, TType.GetProperty(keys[i])), Expression.Constant(Convert.ToInt32(values[i])));
                expression_return = Expression.And(expression_return, temp);
                break;
            case "<=":
                //temp = Expression.Call(Expression.Property(expression_param, TType.GetProperty(keys[i])),
                //    TType.GetProperty(keys[i]).GetType().GetMethod("LessThanOrEqual"), Expression.Constant(values[i]));
                temp = Expression.LessThanOrEqual(Expression.Property(expression_param, TType.GetProperty(keys[i])), Expression.Constant(Convert.ToInt32(values[i])));
                expression_return = Expression.And(expression_return, temp);
                break;
            case "in":
                string[] strarr = values[i].ToString().Split(',');
                Expression or_return = Expression.Constant(false);
                for (int k = 0; k < strarr.Length; k++)
                {
                    temp = Expression.Equal(Expression.Call(Expression.Property(expression_param, TType.GetProperty(keys[i])),
                        TType.GetMethod("ToString")),
                     Expression.Constant(strarr[k]));
                    or_return = Expression.Or(or_return, temp);
                }
     
                expression_return = Expression.And(expression_return, or_return);
                break;
        }
    }
     
    return (Expression<Func<T, bool>>)Expression.Lambda<Func<T, bool>>(expression_return, new ParameterExpression[] { expression_param });
    

    }

           IList<People> peopleList = new List<People>();
                for (int i = 1; i <= 6; i++)
                {
                    People people = new People() { Name = "Dai_" + i.ToString(), Age = 16, Birthday = DateTime.Now, IsBuyCar = true, Sex = "F" };
                    peopleList.Add(people);
                }
                Expression<Func<People, bool>> func_a = GetAndLambdaExpression<People>(new string[] { "Name", "Age" }, new string[] { "Dai_2", "16" }, new string[] { "=", "<" });
                var people_data = peopleList.AsEnumerable().Where(func_a.Compile()).ToList();
  • 相关阅读:
    ExtJs2.0学习系列(1)Ext.MessageBox
    PDF加水印
    ExtJs2.0学习系列(2)Ext.Panel
    负载均衡(续)
    位运算设置权限续(转)
    Excel导出问题解决方案(导出时前面的0自动被去掉)
    SELECT INTO 和 INSERT INTO SELECT 两种表复制语句
    位运算设置权限
    WCF开发实战系列一:创建第一个WCF服务
    通过SQL Server的位运算功能巧妙解决多选查询
  • 原文地址:https://www.cnblogs.com/sjqq/p/8427788.html
Copyright © 2011-2022 走看看