Ошибка Entity Framework при использовании DefaultIfEmpty()

У меня проблема с Entity Framework с использованием метода DefaultIfEmpty. Следующий запрос возвращается пустым, когда он должен вернуть предложение, которое соответствует всем критериям в базе данных.

Если я удаляю один или оба DefaultIfEmpty вызовы методов это работает, но с ними это не так. Мне нужны те, чтобы предотвратить еще одну проблему в запросе.

Когда я выполняю сгенерированный SQL-запрос непосредственно в базе данных, он работает и возвращает предложение.

Я также сделал Unit Test, воспроизводящий тот же пример, и он также проходит, поэтому это должна быть проблема Entity Framework.

Вот запрос:

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

1 ответ

Решение

Измените это на два 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 (отвечающие некоторым критериям), имеющие какие-либо CallTypes соответствует некоторым критериям. Если нет OperatorRanges, не будет никакого CallTypeлибо, не говоря уже о сопоставлении CallTypes.

В этой форме предикат всегда возвращает истину или ложь.

Другие вопросы по тегам