У меня есть:
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-запрос, чтобы возвращалось только запрошенное подмножество итоговых результатов?
OrderBy/Skip/Take возвращает
IEnumerable<T>
OrderBy
имеет перегрузку, которая возвращает IOrderedQueryable<T>
, а не только IOrderedEnumerable<T>
. Так что Skip
и Take
. Компилятор С# достаточно умен, чтобы предпочесть эти перегрузки тем, которые возвращают IEnumerable<T>
, если вы не заставляете это делать иначе. Операция будет выполняться в базе данных, если вы еще не конвертируете ее в IEnumerable
.
Включены ли OrderBy/Skip и Take в выпущенном SQL-запросе, чтобы вернуть только запрошенное подмножество итоговых результатов?
Да, все эти методы поддерживаются, и они будут преобразованы в SQL. Весь список здесь, так как вы можете видеть, что есть перегрузки каждого метода, который принимает IQueryable<T>
.
Да, они переведены на SQL и выполняются непосредственно с БД.