Может кто-нибудь, пожалуйста, скажите мне, как включить предложение where в запрос linq to sql при использовании структуры сущностей с включением
У меня есть следующий запрос:
var test = this.MyContext.MyData
.Include("MoreData")
.Include("EvenMoreData")
.Where(predicate)
Где предикат определяется следующим образом:
t => t.id == myId
Проблема в том, что он не включает предложение Where в SQL-запрос, когда я проверяю его с помощью SQL Server Profiler, из-за чего мой запрос работает очень медленно, так как он возвращает 450 000+ записей вместо 7 в моем конкретном примере.
Любые идеи о том, как я могу включить предложение where в запрос, сгенерированный EF.
ОБНОВЛЕНИЕ-1:
Странно, но при замене предиката переменная устанавливается следующим образом:
private MyObject Get(Func<MyObject, bool> predicate)
...
this.UnitOfWork.MyObject.Get(t=>t.id == myId);
к
var test = this.MyContext.MyData
.Include("MoreData")
.Include("EvenMoreData")
.Where(t=>t.id = 1234)
Оператор where включается, и данные возвращаются мгновенно.
Обратите внимание, что это упрощенный пример, но внешние ключи установлены для некоторых таблиц, а не для всех.
Если у таблиц нет внешних ключей, как тогда можно присоединиться (что делает .Include)?
Я не уверен, но это определенно работает, просто медленно. Я обновлю свой ответ через секунду, так как нашел кое-что интересное, но пока не решение.
Без внешних ключей он не может ограничивать результаты соединения и извлекает все содержимое таблицы (450 КБ?) -> медленно
где ожидает Expression<Func<T,bool>>, так что, возможно, дополнительное преобразование заставляет его оценивать локально?
Возможно, я ошибаюсь насчет внешнего ключа, но не думаю. Как вы объясните комментарии из обновленного ответа
@DevilSuichiro После того, как я изменил это на выражение, мой запрос сократился с 29 секунд до менее 12 мс, что отлично, поскольку теперь он соответствующим образом фильтруется. Спасибо еще раз.





Как упоминалось в комментариях:
.Where() ожидает Expression<Func<T,bool>>, тогда как ваш предикат имеет тип Func<T,bool>. Это (предположительно) запрещает EF преобразовывать его в SQL-запрос, то есть он будет оцениваться локально (в базовой реализации ICollection).
В этой заметке имейте в виду, что условия WHERE для .Include не работают, как вы, вероятно, ожидали, поскольку сгенерированный SQL объединит две сопоставленные таблицы и оценит условие в таблице результатов, а не присоединение к сопоставленной таблице. с сокращенным набором результатов второй таблицы. Причина, по которой этот запрос выполняется быстрее, заключается в следующем: 1. DBS может использовать индексы из-за условия и 2. количество материализуемых строк меньше.
Правильно ли установлены внешние ключи между MyData, MoreData и EvenMoreData?