列表中的降序 与IQueryable OrderByDescending不同

问题描述 投票:2回答:1

我正在研究.NET CORE 2.0应用程序,部分原因是我需要按降序排序GUID。我有List中的GUID列表传递到另一个方法,其中此集合按降序排序但我发现结果不同然后使用IQueryable Linq作为select(x=>x.id).OrderByDescending(x=>x)也与SQL Server比较,第二个选项似乎是正确的。

我需要按降序输出列表排序与IQueryable Linq作为select(x=>x.id).OrderByDescending(x=>x)的结果相同

 List<Guid> sortedList =  
       C95F4897-35D8-409D-BF0E-B0D6E1BCAC55
       D867FD57-F728-46E9-BFF0-F168BAC674C4
       F05BCAA7-600E-406F-B9F3-7CD839FFC98B
       383525C6-F158-431C-A6A5-B42FF3CBF5AE

我也尝试过以下代码,但没有得到正确的结果

     var s1 = sortedList.OrderByDescending(i => i);

        sortedList.Sort();
        sortedList.Reverse();

没有排序的数据

enter image description here

数据在LINQ中的IQueryable排序(这是我之后的结果,但来自collection.sort

enter image description here

数据从集合排序

enter image description here

sql-server linq sorting guid
1个回答
4
投票

当您在列表上调用.OrderByDescending时,您正在调用Enumerable.OrderByDescending。相反,当你在linq查询上调用.OrderByDescending时,你正在调用Queryable.OrderByDescending。差异(这里重要的区别)是可枚举方法使用默认比较器(在本例中为数据类型GUID),而可查询方法转换为在数据库上执行的sql语句,因此使用SQL比较器( uniqueidentifier)。 GUID比较器使用所有16​​个字节,而在SQL中最后6个字节是最重要的(Source1Source2(旧的,但仍然有效))。

你说你想要可查询方法的结果,同时使用可枚举方法(本质上)。您可以使用System.Data.SqlTypes.SqlGuid数据类型而不是system.Guid来实现此目的。您可以简单地将Guid转换为SqlGuid。或者,可能是一个更清洁的解决方案,您可以使用comparer方法创建自己的SqlGuid.CompareTo,并按顺序使用:OrderByDescending(x => x, new MyComparer())

© www.soinside.com 2019 - 2024. All rights reserved.