我的学生表中有两个带有行版本字段的记录。我在C#代码中创建该记录的对象作为学生类。
我的问题是:
答案 0 :(得分:13)
查找最新rowversion的一种方法是使用StructuralComparer
var r1 = new byte[] {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00};
var r2 = new byte[] {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0xFF};
bool r1_is_newer = StructuralComparisons.StructuralComparer.Compare(r1, r2) > 0;
结构比较的一个好处是它们会自动处理NULL
s
关于BitConverter
的使用。如果使用BitConverter
将上述字节数组转换为UInt64
,则最终会得到非常高的数字并且比较没有意义(因为rowversion更改为1,uint64转换后的数字会更改为2 ^ 56)
如果你想在它上面洒一些LINQ以使它变得特别慢,你可以使用
bool r1_is_newer =
Enumerable.Zip(r1, r2, (b1, b2) => new { b1, b2 })
.SkipWhile(item => item.b1 == item.b2)
.Take(1).Any(item => item.b1 > item.b2);
答案 1 :(得分:1)
rowversion
为binary(8)
,如果您使用byte[]
/ SqlCommand
,则会以SqlDataReader
的形式返回。如果您使用EF 4.1,相应的属性也将是byte[]
。
您可以使用BitConverter转换为UInt64
,然后进行比较。您还可以从SQL Server返回行转换为bigint
,这在C#中显示为long
。在任何一种情况下,较大的值都会在以后创建。
在我自己的测试中,我已经看到rowversion从一个小的正值开始(不是0)。如果您投射到bigint
,则必须考虑到达2^64
时会发生什么。就我而言,这不是我必须担心的事情。如果您认为这将在您的数据库中发生,那么您将不得不添加逻辑来处理您的比较,或者只是坚持使用BitConverter.ToUInt64
。
另外,请注意rowversion
列是否接受NULL
;如果有的话,你必须考虑到这一点。