我有一个EF Code First模型,该模型带有一个用Timestamp属性标记的字节数组字段。我需要相互比较两个时间戳,并确定哪个较新。这似乎很简单,但是我不确定SQL Server用哪种值填充该字节数组。我是否将它们转换为UInt64值,就像这样:
BitConverter.ToInt64(item1.Timestamp, 0) < BitConverter.ToInt64(item2.TimeStamp, 0)
...或者我是在这里走进一个微妙的陷阱吗?
最佳答案
是的,您正走进陷阱。字节数组以大端格式存储行版本。但是,BitConverter.ToInt64
在x86和x64 CPU体系结构上期望使用小端格式。我使用BitConverter进行了一个简单的测试,并得到了初始rowversion为0xd207000000000000和下一个rowversion为0xd307000000000000。 SQL Server正在递增8字节序列的最后一个字节,但是BitConverter认为第一个字节是最重要的。您的订单比较偶尔会停止工作不会花很多时间。
解决方案是颠倒rowversion字节的顺序,如下所示:
BitConverter.ToInt64(item1.Timestamp.Reverse().ToArray(), 0) <
BitConverter.ToInt64(item2.TimeStamp.Reverse().ToArray(), 0)
关于c# - 比较EF时间戳值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20347197/