public string GetWhere() { StringBuilder sb = new StringBuilder(); sb.Append("1=1"); if (!string.IsNullOrEmpty(username)) { sb.Append(string.Format(" and UserName='{0}'", username)); } if (!string.IsNullOrEmpty(pwd)) { sb.Append(string.Format(" and pwd='{0}'", pwd)); } return sb.ToString(); }
以上是动态获取到一个字符串,如何改成一个方法,让他动态返回一个lambda表达式,用于对对一个List<UserInfor> list 进行数据筛选。
static Expression<Func<UserInfo, bool>> GetWherePredicate(string name, string pwd) { var p = Expression.Parameter(typeof(UserInfo), "p"); var expr1 = Expression.Equal(Expression.Constant(1), Expression.Constant(1)); if (!string.IsNullOrEmpty(name)) { var expr2 = Expression.Equal(Expression.Property(p, "Name"), Expression.Constant(name)); expr1 = Expression.And(expr1, expr2); } if (!string.IsNullOrEmpty(pwd)) { var expr3 = Expression.Equal(Expression.Property(p, "Password"), Expression.Constant(pwd)); expr1 = Expression.And(expr1, expr3); } var expr4 = Expression.Lambda<Func<UserInfo, bool>>(expr1, p); return expr4; }
调用:
var predicates = GetWherePredicate("jello", "123456");
var filter = list.Where(predicates.Compile());
就算返回.返回的也是委托.而不是lambda表达式.
可以通过构造表达数树来实现你的目标.
没见过你这样用的.linq已经把这样全都做了.你只要学会怎么用linq就行了.不要费这种功夫.
这是要调用的的方法:
public void GetList(Expression<Func<T, bool>> whereLambda)
{
}
lambda要动态生成,明白吗?