Группы в Linq to Sql уже отсортированы по убыванию Count ()? - PullRequest
0 голосов
/ 24 мая 2009

Похоже, но я не могу найти какую-либо конкретную документацию по этому вопросу.

Я спрашиваю, если результат этого запроса:

from x
in Db.Items
join y in Db.Sales on x.Id equals y.ItemId
group x by x.Id into g
orderby g.Count() descending
select g.First()

ВСЕГДА ТАК ЖЕ, как следующий запрос:

from x
in Db.Items
join y in Db.Sales on x.Id equals y.ItemId
group x by x.Id into g
select g.First()

обратите внимание, что второй запрос позволяет Linq определить порядок группы, который в первом запросе определяется как проданное число, от большинства к наименьшему.

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

Ответы [ 3 ]

4 голосов
/ 24 мая 2009

Вы, вероятно, видите это, потому что результат запроса, возвращаемый сервером sqlserver, всегда в том же порядке в ваших тестах. Однако это ошибка: по определению, множества в SQL не имеют порядка, если это явно не указано с помощью ORDER BY. Поэтому, если в ваших запросах нет оператора order by, ваши наборы могут выглядеть так, как будто они упорядочены, но это не так, возможно, в крайних случаях порядок отличается (например, когда сервер должен загружать страницы таблица в другом порядке из-за ограничений памяти или иным образом). Так что практическое правило: если вы хотите заказать, вы должны указать один.

1 голос
/ 24 мая 2009

Если спецификации не гарантируют заказ, вы должны считать его случайным и подлежащим изменению в любой новой версии программного обеспечения.

И не вынимай его, если

а) вы измерили его, и это существенно изменило

b) вы готовы отслеживать, тестировать и изменять его (везде) после каждого крошечного изменения в программной среде.

1 голос
/ 24 мая 2009

Группировка LINQ не гарантирует такой вещи. Хотя это может работать для этого конкретного обстоятельства, оно может не работать в другой ситуации. Избегайте использования этого побочного эффекта .

Кстати, если выходные данные действительно намеренно отсортированы SQL Server из-за кластеризованного индекса или чего-то еще, добавление предложения ORDER BY не повредит, поскольку оптимизатор запросов должен быть достаточно умен, чтобы знать, что результат уже отсортирован, так что вы ничего не потеряете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...