C# 使用表达式组合两个不同的谓词生成器
我有一个谓词生成器,它工作得很好C# 使用表达式组合两个不同的谓词生成器,c#,linq,linq-expressions,predicatebuilder,linq-extensions,C#,Linq,Linq Expressions,Predicatebuilder,Linq Extensions,我有一个谓词生成器,它工作得很好 var filter = sortKeys.Aggregate(filter, (currentFilter, sortkey) => currentFilter.Or( x => x.Appointments.Any(y => y.RowStatus == Constants.CurrentRowStatus ))); 我现在正试图将约会中的条件拆分为另一个谓词生成器,以便可以随时添
var filter = sortKeys.Aggregate(filter, (currentFilter, sortkey) => currentFilter.Or(
x => x.Appointments.Any(y => y.RowStatus == Constants.CurrentRowStatus )));
我现在正试图将约会中的条件拆分为另一个谓词生成器,以便可以随时添加条件并重用该函数
我曾尝试创建一个表达式,然后在主谓词生成器中使用它,但失败了
private static Expression<Func<Appointment, bool>> TmpApt(string status)
{
var predicate = PredicateBuilder.False<Appointment>();
predicate = predicate.Or(p => p.RowStatus == status);
return predicate;
}
private static Expression您可以使用LINQKit调用您想要使用它的位置上的表达式:
var predicate = TmpApt();
var filter = sortKeys.Aggregate(PredicateBuilder.False<Person>(),
(current, s) => current.Or(x =>
x.Appointments.Any(appointment => predicate.Invoke(appointment))))
.Expand();
这里不需要使用谓词生成器来或将其与False
一起使用。非常感谢。。。你的解决方案很有效,但我现在遇到了一个新问题。。我想将参数传递到TmpApt()。参数值来自“s”(在聚合中)。当我们将它声明为变量然后调用它时,我不知道如何传递。有什么解决办法吗。我还将更新主要问题。对不起,这是我的错误。使问题简单化我已经去掉了方法的变量。非常感谢您的帮助和时间。@Rocky那么最简单的选择就是将TmpApt
的调用重构为Aggregate
lambda。它不能在编译为表达式的lambda中,除非您想首先修复LINQKit中的bug,这当然是可能的,但并不简单。
var predicate = TmpApt();
var filter = sortKeys.Aggregate(PredicateBuilder.False<Person>(),
(current, s) => current.Or(x =>
x.Appointments.Any(appointment => predicate.Invoke(appointment))))
.Expand();
private static Expression<Func<Appointment, bool>> TmpApt()
{
return p => p.RowStatus == Constants.CurrentRowStatus;
}