.NET有两种GUID数据类型:Guid,它以“自然”方式排序GUID,SqlGuid,它认为最后一个短划线之后的六个字节是最重要的。这个差异在这里详细解释:MSDN: Comparing GUID and uniqueidentifier Values。GUID比较奇怪
然而,在这两种情况下,下面应持有(假设所有...
s为相等):
57d0affe-... < 57d0afff-... < 57d0b000-...
如果是这样的话,为什么我得到下面的输出(见注释)?
using System;
using System.Data.SqlTypes;
class Program
{
static void Main(string[] args)
{
var g1 = new SqlGuid("57d0affe-9d9d-11e4-bec2-e840f2ad1632");
var g2 = new SqlGuid("57d0afff-9d9d-11e4-bec2-e840f2ad1632");
var g3 = new SqlGuid("57d0b000-9d9d-11e4-bec2-e840f2ad1632");
Console.WriteLine(g1 < g2); // prints True
Console.WriteLine(g2 < g3); // prints False <- ?
Console.ReadLine();
}
}
据我所知,g2 < g3
也应该产生True。我误解了一些东西,或者这是框架中的一些错误吗?如使用普通Guid
而不是SqlGuid
,则输出为预期的两倍True
。
你为什么要摆在首位比较GUID值?我不确定是否有订购GUID的标准。如果您希望可订列使用整数或GUID以外的其他值。 –
@DStanley:在SQL Server中使用GUID作为主键(或聚簇索引)时,排序*很重要(性能方面)。这就是为什么像'newsequentialid()'这样的东西存在。 – Heinzi
如果您需要更多上下文:我们使用Win32 API函数UuidCreateSequential创建将来插入数据库的记录的ID。我们的.NET包装到UuidCreateSequential的单元测试开始出现故障,这让我意识到了这个问题。 – Heinzi