Я использую ASP.NET MVC 4 и Entity Framework 6 (код Сначала) и есть странное поведение, которое я не хочу/вроде:
У меня есть класс сущности Images
, который имеет логическое свойство IsDeleted
, и теперь я хотел бы получить первые 25 изображений, которые не удалены, поэтому я использовал следующие код:. Где (i =>! I.IsDeleted) не переводит на SQL, но .Where (i => i.IsDeleted.Equals (false)) делает
IEnumerable<Image> items = db.Images.Where(i => !i.IsDeleted).Take(25);
Как это было очень медленно, я исследовал немного глубже и выяснил, что Where(i => !i.IsDeleted)
уже запускает запрос DB и все изображения будут загружены (и проанализированы => медленно) и проверка затем происходит «в код". Затем я попробовал Where(i => i.IsDeleted.Equals(false))
, который работал нормально, и проверка произошла через SQL.
Почему это так или как я могу избежать этой проблемы, так как мне нравится первый синтаксис намного лучше?
Возможно, это ошибка uf EF 6 beta или это происходит в версиях al EF?
UPDATE:
Проблема является приведение к IEnumerable<Image>
(я сделал Where
не в той же строке в своем коде, но изменил его здесь для простоты), но я использую это также сделать .OrderBy(...).ThenBy(...)
с помощью Func<T, TKey>
и что ▲ и ▼ делает вернуть IOrderedEnumerable
и не IOrderedQueryable
...
UPDATE 2: решаемые с помощью Expression<Func<T, TKey>>
ключей ...
Hrm. Это любопытно. Что относительно Where (i => i.IsDeleted = false)? – Tim
@Tim: То же, что и '! I.IsDeleted', но я думаю, что это может быть мой неявный приведение к' IEnumerable ', а не' Where' (я сделал «Equals' inline», но '!' " в следующей строке ") - Я изучаю ... –
ChrFin
@chrfin ОК, так вот причина. Вы получите все элементы из базы данных в память, когда вы делаете 'IEnumerable items = db.Images;' Вместо этого используйте 'IQueryable', чтобы создать запрос в парах строк и не заставлять его выполнять, пока вы этого не захотите. –
MarcinJuraszek