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