linq to sql 动态构建查询表达式树

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

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

        public Expression<Func<T, bool>> GetAndLambdaExpression(string[] keys,object[] values,string[] methons)
        {
            Expression expression_return = Expression.Constant(true);
            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])),
                            typeof(double).GetType().GetMethod("GreaterThan"), 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(double).GetType().GetMethod("LessThan"), 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(double).GetType().GetMethod("GreaterThanOrEqual"), Expression.Constant(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]));
                        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 });
        }

希望对大家有点帮助。

posted on 2013-09-04 11:15  simonchan  阅读(1241)  评论(2)    收藏  举报