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对我来说是全新的。

Linq表达式的自定义And()函数

如果没有任何额外的工作,你可以使用:

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);