0

我对使用 DefaultIfEmpty 方法的实体框架有疑问。以下查询应返回与数据库中所有条件匹配的报价时返回空。

如果我删除一个或两个DefaultIfEmpty方法调用,它会起作用,但对它们不起作用。我需要那些来防止查询中的另一个问题。

当我直接在数据库上执行生成的 SQL 查询时,它可以工作并返回报价。

我还做了一个单元测试,重现了相同的示例,它也通过了,所以它一定是实体框架问题。

这是查询:

private static Expression<Func<Offer, bool>> AddFilter(Service criteria)
{
        return offer => offer.Restrictions.

        SelectMany(rest => rest.OperatorRange.DefaultIfEmpty(), (rest, alop) => new { Restriction = rest, OperatorRange = alop.Id }).
        Where(alop => criteria.ServiceUseNet == null || alop.OperatorRange.ToUpper() == criteria.ServiceUseNet.ToUpper()).

        SelectMany(rest => rest.Restriction.CallType.DefaultIfEmpty(), (rest, till) => new { Restriction = rest, CallType = till.Id }).
        Any(till => criteria.UseServiceCoverage == null || till.CallType.ToUpper() == criteria.UseServiceCoverage.ToUpper());
}
4

1 回答 1

0

将其更改为两个Any调用:

return offer => offer.Restrictions
    .Any(rest
        => rest.OperatorRange
                .Where(alop => criteria.ServiceUseNet == null
                             || alop.OperatorRange.ToUpper() == criteria.ServiceUseNet.ToUpper())
        .Any(till => criteria.UseServiceCoverage == null
                  || till.CallType.ToUpper() == criteria.UseServiceCoverage.ToUpper()));

谓词应该测试是否有任何 OperatorRanges(满足某些标准)具有任何 CallType满足某些标准的 s。如果没有OperatorRanges 也不会有CallTypes ,更不用说匹配CallTypes 了。

在这种形式中,谓词总是返回真或假。

于 2016-11-18T19:32:18.573 回答