我在自定义类中有一组数据点。我还有许多不同的条件需要在我的应用程序中以不同的组合进行测试,我想将这些条件定义为表达式。假设我的收藏品有产品。
而不是写
Products.Where(p => p.IsOnSale && p.Color == Color.Blue && p.Quality > 0);
我希望能够做到的,为清楚起见,在一个地方定义谓词:
Expression<Func<Product, bool>> OnSale = (p) => p.IsOnSale;
Expression<Func<Product, bool>> Blue = (p) => p.Color = Color.Blue;
Expression<Func<Product, bool>> InStock = (p) => p.Quantity > 0;
....
然后使用这些谓词过滤我的集合:
Products.Where(OnSale).And(Blue).And(InStock);
或
Products.And(OnSale, Blue, InStock);
所以我可以很容易地看到我正在返回的内容,我只定义一次条件,如果任何条件发生变化,我可以更新谓词而不是每个地方都在做Where()。
我怎样才能做到这一点?我看了PredicateBuilder,但Linq.Expressions对我来说是全新的。
答案 0 :(得分:8)
没有任何额外的工作,你可以使用:
Products.Where(OnSale).Where(Blue).Where(InStock);
... Where
来电自然地构成“和”。或者,PredicateBuilder
使其变得非常简单:
Products.Where(OnSale.And(Blue).And(InStock));
只需要PredicateBuilder
使用合适的using指令来获取其扩展方法。
答案 1 :(得分:4)
最简单的解决方案是将调用链接到Where()
:
Products.Where(OnSale).Where(Blue).Where(InStock);
答案 2 :(得分:1)
你的.And()
与.Where()
完全相同(至少在Linq-to-objects中)。
你可以写:
Productis.Where(p=>p.IsOnSale)
.Where(p=.p.Color = Color.Blue)
.Where(p=>p.Quality > 0);