我的学生表中有两条带有行版本字段的记录.我在C#代码中创建该记录的对象作为学生类.
我的问题是:
Chr*_*ski 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;
Run Code Online (Sandbox Code Playgroud)
结构比较的好处是它们自动处理NULLs
关于使用BitConverter.如果将上述字节数组转换为UInt64使用BitConverter,则最终会得到非常高的数字并且比较没有意义(因为rowversion改变了一个,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);
Run Code Online (Sandbox Code Playgroud)
rowversion是,如果您使用/ ,binary(8)则将返回为 a 。如果您使用 EF 4.1,相应的属性也将为.byte[]SqlCommandSqlDataReaderbyte[]
您可以使用BitConverter进行转换UInt64然后进行比较。您还可以返回 SQL Server 中的 rowversion 强制转换bigint,这在 C# 中显示为 a long。无论哪种情况,更大的价值都会在以后创造。
在我自己的测试中,我发现 rowversion 从一个小的正值(而不是 0)开始。如果您确实强制转换为bigint,则必须考虑当它到达 时会发生什么2^64。就我而言,这不是我需要担心的事情。如果您认为这种情况会在数据库中发生,那么您必须在比较中添加逻辑来处理该问题,或者只坚持使用BitConverter.ToUInt64.
rowversion另外,如果您的专栏接受NULL; ,请小心。如果确实如此,您将必须对此负责。
| 归档时间: |
|
| 查看次数: |
6590 次 |
| 最近记录: |