C# Linq to Sql中的组是否已按Count()降序排序?

C# Linq to Sql中的组是否已按Count()降序排序?,c#,linq-to-sql,sorting,grouping,C#,Linq To Sql,Sorting,Grouping,看起来是这样,但我找不到关于这个主题的任何权威性文件 我想问的是,这个查询的结果是否: 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 g

看起来是这样,但我找不到关于这个主题的任何权威性文件

我想问的是,这个查询的结果是否:

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会以这种方式自动对组进行排序,而似乎表明情况正好相反——项是按照它们在select中出现的顺序返回的。我认为,如果以这种方式进行排序,添加额外的排序是毫无意义的,会浪费周期,最好将其忽略。

您可能会看到这一点,因为sqlserver返回的查询结果在测试中总是以相同的顺序进行。然而,这是一个谬误:根据定义,SQL中的集合没有顺序,除非它是用order by显式指定的。因此,如果您的查询没有order by语句,那么您的集合看起来可能是有序的,但事实并非如此,在edge情况下,顺序可能不同(例如,由于内存限制或其他原因,服务器必须以不同的顺序加载表页)。所以经验法则:如果你想要一个订单,你必须指定一个

您可能会看到这一点,因为在测试中,从sqlserver返回的查询结果的顺序总是相同的。然而,这是一个谬误:根据定义,SQL中的集合没有顺序,除非它是用order by显式指定的。因此,如果您的查询没有order by语句,那么您的集合看起来可能是有序的,但事实并非如此,在edge情况下,顺序可能不同(例如,由于内存限制或其他原因,服务器必须以不同的顺序加载表页)。所以经验法则:如果你想要一个订单,你必须指定一个

LINQ分组不能保证这一点。虽然它可能适用于该特定情况,但在另一种情况下可能不起作用避免依赖这种副作用


顺便说一下,如果由于聚集索引或其他原因,SQL Server确实有意对输出进行排序,那么添加一个
ORDER By
子句不会有什么坏处,因为查询优化器应该足够聪明,知道结果已经排序,所以不会丢失任何内容。

LINQ grouping不能保证这样做。虽然它可能适用于该特定情况,但在另一种情况下可能不起作用避免依赖这种副作用


顺便说一下,如果由于聚集索引或其他原因,SQL Server确实有意对输出进行排序,那么添加一个
ORDER By
子句不会有什么坏处,因为查询优化器应该足够聪明,知道结果已经排序,所以,你不会丢失任何东西。

< P>如果规格不保证一个订单,你应该认为它是偶然的,并且可能随着软件的任何新版本而改变。 不要把它拿出来除非

a) 你已经测量了它,它产生了显著的差异


b)在软件环境中的每一个微小变化之后,你都愿意监视、测试和改变它。(

< P>)如果规格不保证一个订单,你应该认为它是偶然的,并且可能随着软件的任何新版本而改变。 不要把它拿出来除非

a) 你已经测量了它,它产生了显著的差异


b) 您愿意在软件环境中的每一个微小更改之后监视、测试并将其更改回(任何地方)。

您是否打开了Sql Profiler?它实际上是否在Select的末尾附加了一个orderby?否。说得好。如果您这样做并将结果发布在回答中,我会接受。您是否打开了Sql Profiler?它实际上是否在Select的末尾附加了一个orderby?否。说得好。如果你这样做了,并在回复中公布结果,我会接受。