У меня есть это:
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;
Хотя я понимаю использование обоих (и один генерирует ошибку позже), я не понимаю, чем они отличаются.
Я видел такие вопросы боюсь, в другом месте на СТО, но я не знаю, каков ответ на этот вопрос.
Тип, реализующий IOrderedQueryable
, содержит дополнительное состояние для хранения информации о сортировке.
IQueryable
обычно представляет собой операцию, которая будет выполнена позже (и, возможно, на совершенно другом языке на другом компьютере, например, с LINQ to SQL). Необходим отдельный интерфейс, потому что следующая операция может быть другой сортировкой, которую нужно обрабатывать иначе, чем первую (для сортировки по столбцу A, а затем B требуется определение двух операторов LINQ, но система должна гарантировать, что каждый ключ способствует общий вид).
Легко увидеть, если вы переведете понимание запроса в соответствующие методы расширения Linq. Тип возврата OrderBy () - IOrderedEnumerable <>. Where () возвращает IEnumerable <>. Ваше первое выражение сначала сортирует все точек, а затем выбирает только те, которые соответствуют предложению where. Последняя примененная операция - Where, поэтому тип выражения - IEnumerable <>.
Какой из них более эффективен, во многом зависит от используемого вами провайдера Linq. Мои деньги идут на сортировку в последнюю очередь. Хотя я предполагаю, что провайдер достаточно умен, чтобы упорядочить операции в лучшем порядке. Возможно, вы захотите это проверить.
IOrderedQueryable результат запроса, который приводит к определенному порядку, а IQueryable содержит элементы в неопределенном порядке.