前一篇在介绍动态查询时,提到一个问题:如何根据用户的输入条件,动态构造这个过滤条件表达式呢?
Expression
理想情况下,我希望可以像下面这样来构造predicate,这样,我们就可以使用&、| 、&=、|=来任意拼接过滤条件了:
1: Expressionbool>> predicate = null;
2: predicate &= (t => t.ProductName.Contains("che")) | (t => t.UnitPrice >= 22);
但是理想与现实之间,似乎总有不可逾越的鸿沟……
前面的代码中,我们总是要写一常串Expression
无奈之下,只好实现了下面的这种方式,勉强凑合用着:
1: ExpressionProductExt, bool>> predicate = null;
2: predicate = predicate.AndAlso(p => p.CompanyName.Length > 2)3: .OrElse((Products p) => p.ProductName.Contains("che"))
4: .AndAlso((Products p) => p.UnitPrice >= 22);运算得到的结果如下:p => (((p.CompanyName.Length > 2) || p.ProductName.Contains("che")) && (p.UnitPrice >= 22))
有了这个OrElse和AndAlso扩展,我们就可以对Expression
不过跟之前文章中提到的一样,这里有个限制:虽然我们的Expression中,第一个可以凡泛型参数可以传任意值(譬如传ProductExt或 Products或其他的,可以不必要求是同一种类型),但条件中用到的对象属性(譬如CompanyName、ProductName、 UnitPrice ),必须在T中存在同名属性。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/12639172/viewspace-626327/ ,如需转载,请注明出处,否则将追究法律责任。