【问题标题】:OrderBy and Distinct using LINQ-to-EntitiesOrderBy 和 Distinct 使用 LINQ-to-Entities
【发布时间】:2010-03-12 20:07:32
【问题描述】:

这是我的 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]

这是一个错误吗?我的订单在哪里,该死的?

【问题讨论】:

    标签: sql linq sql-server-2008 linq-to-entities


    【解决方案1】:

    您应该 Distinct 之后排序,因为它不保证保留顺序:

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

    【讨论】:

    • 此代码无法编译。 OrderBy 给出错误:The type arguments cannot be inferred from the usage. Try specifying the type arguments explicitly.
    • 哦,我明白了,它必须是OrderBy(o => o),因为此时项目已经被选中(我们正在使用IQueryable<string>)。我已经修复了您的代码并给了您复选标记 - 谢谢!
    【解决方案2】:

    这个问题讨论了 Linq to Objects 的规则: Preserving order with LINQ

    在数据库中,保持顺序的操作更少。没有人在区分时保持顺序(通常使用哈希算法)。

    【讨论】:

    • 不过,查询 SELECT DISTINCT ... ORDER BY ... 在 SQL Server 中的工作方式与您期望的一样,并且可能在其他 DBMS 中 - 是否有原因 orderby LINQ 子句在这种情况下在生成 SQL 时被忽略(它至少会抛出一个错误)?我仍然认为这是一个错误 - LINQ 查询在 String[] 上使用时可以正常工作。
    • 如果查看查询计划,会发现 ORDER BY 出现在 DISTINCT 之后。因此,对 ORDER BY 中可能出现的内容有严格的限制。这只是 SQL 语法引起混淆的另一种情况。
    • 什么是“查询计划”,如何查看?我使用 SQL Server 2008 Profiler 获得了上面的查询,但它显然只为您提供了最终查询。
    • 将查询放入SqlStudio(以前称为Query Analyzer)的查询窗口中。点击“显示预估执行计划”。
    猜你喜欢
    • 2011-06-29
    • 1970-01-01
    • 2016-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多