【问题标题】:LINQ to SQL does not generate ORDER BY when DISTINCT is used?使用 DISTINCT 时 LINQ to SQL 不生成 ORDER BY?
【发布时间】:2012-04-03 15:09:56
【问题描述】:

以下基本 LINQ to SQL 语句不会导致 orderby 工作。正如您在 T-SQL 中看到的,没有 orderby。你知道为什么吗?

LINQ to SQL:

      var results = (from stats in db.t_harvest_statistics
                       orderby stats.unit_number
                       select stats.unit_number).Distinct().ToList();

以上结果导致以下 TSQL

SELECT 
[Distinct1].[unit_number] AS [unit_number]
FROM ( SELECT DISTINCT 
[Extent1].[unit_number] AS [unit_number]
FROM [dbo].[t_harvest_statistics] AS [Extent1]
     )  AS [Distinct1]

【问题讨论】:

  • unit_number 是标识列吗?
  • 不,unit_number 不是身份。它是一个 int 数据类型

标签: linq-to-sql sql-order-by distinct


【解决方案1】:

这是 SQL 和关系代数的限制 ORDER BY 与 DISTINCT 的关系。

ORDER BY 必须在 SQL 中“更远”(在“顶层”),因为它是一个视图操作。虽然可以编写具有 ORDER BY “进一步”的 SQL,但与 RA 操作相关,它通常会导致未定义的行为(有时会起作用)。从这个角度来看,Linq2Sql 可以随意忽略 ORDER BY 是有道理的,但也许例外会更好......无论如何它会不那么微妙;-) (实际上,同样的问题存在于任何不提供 Distinct 的“更严格”定义的 Linq 提供程序。)

删除Distinct(),Linq2Sql 应该再次按预期生成 ORDER BY。解决方案就是切换操作顺序,使 ORDER BY 再次处于“顶层”。

这篇文章Use of Distinct and OrderBy in LINQ

这种行为可能看起来很奇怪。 问题在于 Distinct 运算符不保证它会保持值的原始顺序。 应用于 LINQ to SQL,这意味着在查询类似 queryA 的情况下可以忽略排序约束.

解决方案非常简单:将 OrderBy 运算符放在 Distinct 运算符之后,如下面的 queryB 定义:

var queryB = 
    (from o in db.Orders
     select o.Employee.LastName)
    .Distinct().OrderBy( n => n );

编码愉快。

【讨论】:

  • @KeelRisk OrderBy 需要一些东西,因为没有 OrderBy() 过载(如果存在,将以相同的方式定义)。我猜OrderByYeSelf 的情况并没有被确定为足够特别;-)
【解决方案2】:

我在从事务表中排序年份时遇到了同样的问题。

试试这个

 var results = (from stats in db.t_harvest_statistics
                       select stats.unit_number).Distinct().OrderBy(x =(Int16)x.unit_number).ToList();

得到不同值后使用orderby方法

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-18
    • 2020-05-21
    • 1970-01-01
    • 1970-01-01
    • 2016-05-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多