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

1

У меня есть:

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? Некоторые идеи здесь .
  • 0
    IQueryable компилируется в sql. Так что, да, возвращается только подмножество запросов из общих результатов
Показать ещё 2 комментария
Теги:
linq
entity-framework

3 ответа

3
Лучший ответ

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

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

2

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

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

1

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню