我正在研究.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();
答案 0 :(得分:4)
当您在列表上调用.OrderByDescending时,您正在呼叫Enumerable.OrderByDescending。相反,当您在linq查询上调用.OrderByDescending时,您正在调用Queryable.OrderByDescending。
差异(这里重要的区别)是可枚举方法使用默认比较器(在本例中为数据类型GUID
),而可查询方法转换为在数据库上执行的sql语句,因此使用SQL比较器(uniqueidentifier
)。 GUID
比较器同等地使用所有16个字节,而在SQL中,最后6个字节是最重要的(Source1,Source2(旧的,但仍然有效)。)
你说你想要可查询方法的结果,同时使用可枚举方法(本质上)。您可以使用System.Data.SqlTypes.SqlGuid
数据类型而不是system.Guid
来实现此目的。您可以简单地将Guid转换为SqlGuid。或者,也许是一个更清洁的解决方案,您可以使用SqlGuid.CompareTo
方法创建自己的comparer,并按顺序使用该方法:OrderByDescending(x => x, new MyComparer())
。