我在列表中有多个表达式。
var expressions = new List<Expression<Func<T, bool>>>() { .... };
我想创建一个扩展方法来匹配它们的AND或or逻辑。
public static class ExpressionExtension{
public static Expression<Func<T, bool>> And(this IList<Expression<Func<T, bool>>> exp){
// for all items with AND
}
public static Expression<Func<T, bool>> Or(this IList<Expression<Func<T, bool>>> exp){
// for all items with OR
}
}
我该怎么做?
作为一个建议,我会重新考虑如何命名扩展。它们似乎对应于现有的LINQAll()
和Any()
方法。您可以为单个谓词添加And()
和Or()
,这将更有意义。
使用谓词生成器:
public static class ExpressionExtensions
{
public static Expression<Func<T, bool>> All<T>(this IEnumerable<Expression<Func<T, bool>>> source) =>
source.Aggregate(PredicateBuilder.True<T>(),
(acc, predicate) => acc.And(predicate) // And() provided by PredicateBuilder
);
public static Expression<Func<T, bool>> Any<T>(this IEnumerable<Expression<Func<T, bool>>> source) =>
source.Aggregate(PredicateBuilder.False<T>(),
(acc, predicate) => acc.Or(predicate) // Or() provided by PredicateBuilder
);
}