Linq表达式的自定义And()函数
本文关键字:函数 And 自定义 表达式 Linq | 更新日期: 2023-09-27 18:22:03
我有一个自定义类中的数据点集合。我还需要在整个应用程序中以不同的组合测试许多不同的条件,我想将这些条件定义为表达式。假设我的收藏中有"产品"。
而不是写
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对我来说是全新的。
如果没有任何额外的工作,你可以使用:
Products.Where(OnSale).Where(Blue).Where(InStock);
Where
将compose称为"And"。或者,PredicateBuilder
使它变得非常简单:
Products.Where(OnSale.And(Blue).And(InStock));
这只需要PredicateBuilder
可以使用一个合适的using指令来获取其扩展方法。
最简单的解决方案是将调用链接到Where()
:
Products.Where(OnSale).Where(Blue).Where(InStock);
您的.And()
与.Where()
完全相同(至少在Linq to对象中)。
你可以写:
Productis.Where(p=>p.IsOnSale)
.Where(p=.p.Color = Color.Blue)
.Where(p=>p.Quality > 0);