2014-11-03 2 views
1

у меня есть:Где EF linq пропустить/выполнить выполнение?

IQueryable<Entity> query = (from e in Context.Set<TEntity>() select e); 
IEnumerable<TEntity> result = query.OrderBy(x=>x.Property).Skip(10).Take(10); 

OrderBy/Skip/Take возвращает IEnumerable<T>. Я обеспокоен тем, что произойдет, что все результаты будут возвращены, а затем Linq будет использоваться, чтобы взять только часть из них.

Мой вопрос: Являются ли OrderBy/Skip и Take включенными в выпущенный SQL-запрос таким образом, что возвращается только запрошенное подмножество итоговых результатов?

+2

Пробовал ли вы его при мониторинге SQL Server? [Некоторые идеи здесь] (http://stackoverflow.com/questions/23822878/entity-framework-skip-take-functionality). – BCdotWEB

+0

IQueryable скомпилирован в sql. Итак, да, возвращается только подмножество запроса из итоговых результатов. –

+0

В качестве побочной темы я рекомендую вам прочитать о отложенном исполнении. http://blogs.msdn.com/b/charlie/archive/2007/12/09/deferred-execution.aspx –

ответ

3

OrderBy/Skip/Take возвращать IEnumerable<T>

OrderByhas an overload that returns IOrderedQueryable<T>, а не только IOrderedEnumerable<T>. Так делают Skip и Take. Компилятор C# достаточно умен, чтобы предпочесть эти перегрузки тем, которые возвращают IEnumerable<T>, если вы не заставляете это делать иначе. Операция будет выполняться в базе данных, если вы не конвертируете ее в IEnumerable слишком рано.

2

Приняты ли заказBy/Skip и Take в выпущенном SQL-запросе, чтобы возвращалось только запрошенное подмножество итоговых результатов?

Да, все эти методы поддерживаются и они будут преобразованы в SQL.The всего списка является here, как вы можете видеть, что есть перегруженные каждый метод, который принимает IQueryable<T>.

1

Да, они переведены на SQL и выполняются непосредственно с БД.

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