使用LINQ-to-Entities进行OrderBy和Distinct

5

这是我的LINQ查询:

(from o in entities.MyTable
orderby o.MyColumn
select o.MyColumn).Distinct();

以下是结果:

{"a", "c", "b", "d"}

以下是生成的SQL语句:

SELECT 
[Distinct1].[MyColumn] AS [MyColumn]
FROM ( SELECT DISTINCT 
    [Extent1].[MyColumn] AS [MyColumn]
    FROM [dbo].[MyTable] AS [Extent1]
)  AS [Distinct1]

这是一个bug吗?我的排序呢,该死的!

2个回答

10

由于Distinct没有保证保留顺序,因此您应该在之后进行排序:

entities.MyTable.Select(o => o.MyColumn).Distinct().OrderBy(o => o);

这段代码无法编译。OrderBy 函数报错:无法从使用中推断出类型参数。请尝试显式指定类型参数。 - BlueRaja - Danny Pflughoeft
哦,我明白了,它需要是 OrderBy(o => o),因为此时项目已经被选择了(而且我们正在使用一个 IQueryable<string>)。我已经修复了你的代码并给了你勾选标记 - 谢谢! - BlueRaja - Danny Pflughoeft

1
这个问题讨论了 Linq to Objects 的规则: 使用 LINQ 保留顺序 在数据库中,即使是更少的操作也能保持顺序。当进行 Distinct 操作时,通常会使用哈希算法,因此没有任何人会保留顺序。

然而,在SQL Server中,查询SELECT DISTINCT ... ORDER BY ...的工作方式与您预期的相同,并且可能在其他DBMS中也是如此 - 当生成SQL时,为什么在这种情况下只忽略orderby LINQ子句(它至少可以抛出一个错误)? 我仍然认为这是一个错误 - 当在String []上使用LINQ查询时,它可以正常工作。 - BlueRaja - Danny Pflughoeft
如果您检查查询计划,它会揭示出ORDER BY发生在DISTINCT之后。因此,在ORDER BY中出现的内容有严格的限制。这仅是SQL语法引起混乱的另一个案例。 - Amy B
“查询计划”是什么,如何查看它?我使用 SQL Server 2008 Profiler 获取了上面的查询,但显然只提供了最终查询。 - BlueRaja - Danny Pflughoeft
1
将查询放入 SqlStudio(以前称为查询分析器)的查询窗口中。单击“显示预估执行计划”。 - Amy B

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接