1

我有一个谓词生成器,它工作正常

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

更改了主要谓词以使用上述表达式

var filter = sortKeys.Aggregate(PredicateBuilder.True<Person>(), (current, s) =>
                                current.Or(x => x.Appointments.Any(TmpApt(s))));

它显示一个错误

参数类型“ System.Linq.Expressions.Expression<System.Func<Appointment,bool>>”不可分配给参数类型System.Func<Appointment,bool>

我什至尝试过像 Expand 这样的 LinqKit 扩展方法,但可以找到解决方案。

也曾在 LINQ 中尝试过Reusable 谓词表达式,然后它在编译时没有显示任何错误,但是在应用程序端,它显示

用于查询运算符 ' Any' 的重载不受支持。

谁能帮我解决错误或提出替代解决方案。

4

1 回答 1

2

您可以使用 LINQKit 调用您在要使用它的位置拥有的表达式:

var predicate = TmpApt();
var filter = sortKeys.Aggregate(PredicateBuilder.False<Person>(),
    (current, s) => current.Or(x =>
        x.Appointments.Any(appointment => predicate.Invoke(appointment))))
        .Expand();

TmpApt请注意,由于其实现中的错误,您需要提取变量以使 LINQKit 成功评估它。

另请注意,您需要将聚合操作初始化为False,因为True与任何东西进行或运算是true.

另请注意,您可以将实现简化为TmpApt以下内容:

private static Expression<Func<Appointment, bool>> TmpApt()
{
    return p => p.RowStatus == Constants.CurrentRowStatus;
}

这里不需要使用谓词构建OrFalse

于 2014-09-25T15:40:05.917 回答