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 }); }
希望对大家有点帮助。
浙公网安备 33010602011771号