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

标签 c# linq

我在自定义类中有一组数据点。我还有许多不同的条件需要在整个应用程序中以不同的组合进行测试,我想将这些条件定义为表达式。假设我的收藏有产品。

代替写作

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 调用自然组成“And”。或者,PredicateBuilder让它变得非常简单:

Products.Where(OnSale.And(Blue).And(InStock));

这只需要 PredicateBuilder 可以使用合适的 using 指令来获取其扩展方法。

关于c# - Linq 表达式的自定义 And() 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9097676/

相关文章:

c# - LINQ 中的内部联接有问题

c# - 已插入但尚未提交的记录的查询上下文

javascript - 如何在 Breeze 中对扩展实体使用谓词

C# Linq 等效于 SQL Count()

c# - 将 IEnumerable 转换为 IList 返回 null

c# - RequestPath 可以与默认文件一起使用,就像 dotnet 核心中的静态文件一样吗?

javascript - Javascript确认表单提交MVC

c# - 如何在函数中传递 IList<T> 参数

c# - 开发人员开始从SQL迁移到NO-SQL(CouchDB,FathomDB,MongoDB等)时必须采取哪些 “mental steps”?

c# - 为什么 List.Sum() 与 foreach 相比性能较差?