2013-08-16 2 views
5

Я использую 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>> ключей ...

+1

Hrm. Это любопытно. Что относительно Where (i => i.IsDeleted = false)? – Tim

+0

@Tim: То же, что и '! I.IsDeleted', но я думаю, что это может быть мой неявный приведение к' IEnumerable ', а не' Where' (я сделал «Equals' inline», но '!' " в следующей строке ") - Я изучаю ... – ChrFin

+2

@chrfin ОК, так вот причина. Вы получите все элементы из базы данных в память, когда вы делаете 'IEnumerable items = db.Images;' Вместо этого используйте 'IQueryable', чтобы создать запрос в парах строк и не заставлять его выполнять, пока вы этого не захотите. – MarcinJuraszek

ответ

0

T проблема заключалась в том, что как только вы используете IEnumerable, запрос будет выполнен, и все следующие запросы будут выполняться как запросы LINQ к объектам.

Моя ошибка, которая пусть на этот вопрос, что я тестировал запросов следующим образом:

IEnumerable<Image> items = db.Images.Where(i => i.IsDeleted.Equals(false)); 

и

IEnumerable<Image> items = db.Images; 
images = images.Where(i => !i.IsDeleted); 

Таким образом, в первом случае Where еще выполняется против IQueryable, но во втором случае против IEnumerable.

Позже я столкнулся с проблемой, что для OrderBy и IQueryable вам нужно Expression<Func<T, K>> параметры и я Expression<Func<T, IComperable>>, но, например, Func<T, int> не может быть отправлен в Func<T, IComperable> по Entity Framework.
Подробнее о том, как преодолеть эту проблему см. Мой другой вопрос HERE

 Смежные вопросы

  • Нет связанных вопросов^_^