В чем разница между IOrderedQueryable и IQueryable? - PullRequest
10 голосов
/ 17 августа 2010

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

    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;

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

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

Ответы [ 3 ]

5 голосов
/ 17 августа 2010

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

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

2 голосов
/ 17 августа 2010

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

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

0 голосов
/ 17 августа 2010

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

...