2

在客户端应用程序中,我需要将表的所有数据保存在内存中。我经常从数据库中重新读取数据以确保我拥有最新的数据。为了避免每次我使用 RowVersion/Timestamp 列来仅获取更改的数据时读取所有数据:

SELECT ... WHERE CAST(RowVersion AS BIGINT) > @lastReadMaxRowVersion

如何在 Linq2Sql 中做到这一点?如果我将 dbml 中的服务器数据类型更改为 BIGINT,则会收到 InvalidCastException。

4

1 回答 1

1

您应该能够通过对System.Data.Linq.Binary对象进行比较来执行类似的操作,这些对象表示 .NET 中的 RowVersion/Timestamp 值。

除了,你真的不会比较任何东西。诀窍是编写一个 LINQ 查询,该查询将被翻译成T-SQL进行实际比较。

通过使用一个带有Compare2 个Binary参数的方法,LINQ 会很高兴地生成一些T-SQL比较数据库中的 rowversion 字段的参数。它不会调用实际的方法。它只是用来使其生成所需的 SQL。

而不是存储最新读取的 rowversion 值,因为Int64您只是存储它Binary

private Binary _latestRowVersion = new Binary(new byte[] { 0 });

private void Read()
{
    using (var ctx = new DataContext())
    {
        var all =
            (from c in ctx.Categories
             where c.RowVersion.Compare(_latestRowVersion) > 0
             select c).ToList();

        if (all.Any())
        {
            _latestRowVersion =
                all.OrderByDescending(
                    p => BitConverter.ToInt64(p.RowVersion.ToArray(), 0))
                .First()
                .RowVersion;
        }
    }
}

public static class BinaryComparer
{
    public static int Compare(this Binary item1, Binary item2)
    {
        throw new NotImplementedException();
    }
}
于 2013-06-17T17:52:10.970 回答