List<Guid> 中的降序不同于 IQueryable OrderByDescending

Descending order in List<Guid> is different then IQueryable OrderByDescending

我正在开发 .NET CORE 2.0 应用程序,其中一部分我需要按降序对 GUID 进行排序。我将列表中的 GUID 列表传递给另一种方法,其中该集合按降序排序但我发现结果不同然后使用 IQueryable Linq 作为 select(x=>x.id).OrderByDescending(x=>x) 也与 SQL 服务器进行比较,第二个选项似乎正确的。

我需要按降序输出列表排序作为与 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();

没有排序的数据

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

数据从集合中排序

当您在列表上调用 .OrderByDescending 时,您正在调用 Enumerable.OrderByDescending. Conversely, when you are calling .OrderByDescending on a linq query, you are calling 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()) .