В чем разница между IOrderedQueryable и IQueryable?

У меня есть это:

    var points = from p in ContextDB.Points
                 orderby p.PointInTime descending
                 where p.InstanceID == instanceId
                 && p.ParentPointID == null
                 && p.PointTypeID == currentPointTypeID
                 select p;

и это:

    var points = from p in ContextDB.Points
                 where p.InstanceID == instanceId
                 && p.ParentPointID == null
                 && p.PointTypeID == currentPointTypeID
                 orderby p.PointInTime descending
                 select p;

Хотя я понимаю использование обоих (и один генерирует ошибку позже), я не понимаю, чем они отличаются.

Я видел такие вопросы боюсь, в другом месте на СТО, но я не знаю, каков ответ на этот вопрос.

10
задан Brian Rasmussen 17 August 2010 в 11:33
поделиться

3 ответа

Тип, реализующий IOrderedQueryable , содержит дополнительное состояние для хранения информации о сортировке.

IQueryable обычно представляет собой операцию, которая будет выполнена позже (и, возможно, на совершенно другом языке на другом компьютере, например, с LINQ to SQL). Необходим отдельный интерфейс, потому что следующая операция может быть другой сортировкой, которую нужно обрабатывать иначе, чем первую (для сортировки по столбцу A, а затем B требуется определение двух операторов LINQ, но система должна гарантировать, что каждый ключ способствует общий вид).

5
ответ дан 4 December 2019 в 02:49
поделиться

Легко увидеть, если вы переведете понимание запроса в соответствующие методы расширения Linq. Тип возврата OrderBy () - IOrderedEnumerable <>. Where () возвращает IEnumerable <>. Ваше первое выражение сначала сортирует все точек, а затем выбирает только те, которые соответствуют предложению where. Последняя примененная операция - Where, поэтому тип выражения - IEnumerable <>.

Какой из них более эффективен, во многом зависит от используемого вами провайдера Linq. Мои деньги идут на сортировку в последнюю очередь. Хотя я предполагаю, что провайдер достаточно умен, чтобы упорядочить операции в лучшем порядке. Возможно, вы захотите это проверить.

2
ответ дан 4 December 2019 в 02:49
поделиться

IOrderedQueryable результат запроса, который приводит к определенному порядку, а IQueryable содержит элементы в неопределенном порядке.

0
ответ дан 4 December 2019 в 02:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: