List <guid>中的降序与IQueryable OrderByDescending不同

时间:2018-02-15 11:46:47

标签: sql-server linq sorting guid

我正在研究.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();

没有排序的数据

hostname

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

enter image description here

数据从集合中排序

enter image description here

1 个答案:

答案 0 :(得分: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。或者,也许是一个更清洁的解决方案,您可以使用SqlGuid.CompareTo方法创建自己的comparer,并按顺序使用该方法:OrderByDescending(x => x, new MyComparer())