使用DISTINCT时,LINQ to SQL不生成ORDER BY?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用DISTINCT时,LINQ to SQL不生成ORDER BY?相关的知识,希望对你有一定的参考价值。

以下基本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]
答案

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

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

删除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 );

快乐的编码。

另一答案

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

试试这个

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

获得不同的值后使用orderby方法

以上是关于使用DISTINCT时,LINQ to SQL不生成ORDER BY?的主要内容,如果未能解决你的问题,请参考以下文章

利用linq to sql 建立查询方法返回值类型为List<T> 怎样去除集合中的重复数据?

将 SQL 子查询转换为包含 IN、DISTINCT 关键字的 LINQ 格式

在 C# 中使用 LINQ 方法语法 (LINQ to SQL) 时发生异常

LINQ to SQL class LINQ to sql Objects?

在 Windows Phone 上使用 Linq to SQL 时,是不是可以提高批量删除的性能?

在运行时将实体对象添加到 LINQ-to-SQL 数据上下文 - SQL、C#(WPF)