DISTINCT()和ORDERBY问题

Dan*_*nte 22 .net c# linq linq-to-sql

我正在学习LINQ-to-SQL,一切都很顺利,直到发生奇怪的事情:

我试着做一个例子distinct,所以,使用Northwind dabatase我写了以下查询:

var query = 
    from o in db.Orders
    orderby o.CustomerID
    select new
    {
        o.CustomerID
    };
Run Code Online (Sandbox Code Playgroud)

如果我打印LINQ-to-SQL为其中存储的查询生成的SQL,query则如下所示:

SELECT [t0].[CustomerID]
FROM [dbo].[Orders] AS [t0]
ORDER BY [t0].[CustomerID]
Run Code Online (Sandbox Code Playgroud)

所以,像往常一样,查询把所有的CustomerID每一个OrderOrders按字母顺序排序表.

但!如果我使用这样的Distinct()方法:

var query = (
    from o in db.Orders
    orderby o.CustomerID
    select new
    {
        o.CustomerID
    }).Distinct();
Run Code Online (Sandbox Code Playgroud)

该查询带来了该Distinct子句的预期结果,但是CustomerID尽管我写了,但是没有订购orderby o.CustomerID!

第二个LINQ查询的SQL查询如下:

SELECT DISTINCT [t0].[CustomerID]
FROM [dbo].[Orders] AS [t0]
Run Code Online (Sandbox Code Playgroud)

我们可以看到**该ORDER BY条款缺失.这是为什么?

ORDER BY当我使用该Distinct()方法时,为什么该子句会消失?

Joa*_*son 38

Queryable.Distinct文档 ;

预期的行为是它返回源中唯一项的无序序列.

换句话说,当你使用Distinct()它时,现有IQueryable的任何顺序都会丢失.

你想要的可能是更像这样的东西,在Distinct()完成之后的OrderBy();

var query = (from o in db.Orders
             select new
             {
                 o.CustomerID
             }).Distinct().OrderBy(x => x.CustomerID);
Run Code Online (Sandbox Code Playgroud)


Kei*_*thS 15

尝试重新排列成员以在Distinct之后放置OrderBy.你必须恢复方法链:

db.Orders.Select(o=>o.CustomerId).Distinct().OrderBy(id=>id);
Run Code Online (Sandbox Code Playgroud)

无论如何,这将是在Enumerable Linq中设置查询的更有效方式,因为OrderBy将仅对唯一项而不是对所有项进行操作.另外,根据MSDN,Enumerable.Distinct无论如何都不保证元素的返回顺序,因此在重复删除之前的排序是没有意义的.

  • 不,这是设计的. (3认同)
  • @KeithS你读过你的链接......"结果序列是无序的." 当它嵌入到设计中时,它不是一个错误. (2认同)