Ошибка 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()));
Предикат должен проверить, есть ли OperatorRange
s (отвечающие некоторым критериям), имеющие какие-либо CallType
s соответствует некоторым критериям. Если нет OperatorRange
s, не будет никакого CallType
либо, не говоря уже о сопоставлении CallType
s.
В этой форме предикат всегда возвращает истину или ложь.