12

rowversion我应该如何使用实体框架比较字段?我有一个包含一rowversion列的表,我想从行版本高于指定值的表中获取数据。

byte[] rowversion = ... some value;
 _context.Set<T>().Where(item => item.RowVersion > rowVersion);

此行不起作用,它会引发错误:

运算符 '>' 不能应用于 'byte[]' 和 'byte[]' 类型的操作数

知道如何比较rowversionC#/Entity Framework 中的字段吗?

4

3 回答 3

9

这是我们为解决这个问题所做的。使用这样的比较扩展:

public static class EntityFrameworkHelper
{
    public static int Compare(this byte[] b1, byte[] b2)
    {
        throw new Exception("This method can only be used in EF LINQ Context");
    }
}

然后你可以这样做:

byte[] rowversion = .....somevalue;
_context.Set<T>().Where(item => item.RowVersion.Compare(rowversion) > 0);

这在没有 C# 实现的情况下工作的原因是因为Compare从未实际调用扩展方法,并且 EF LINQ 简化x.Compare(y) > 0x > y.

于 2017-03-13T14:01:58.113 回答
1

你确定这是对 RowVersion 的犹太洁食吗?翻车时会发生什么?

我认为您需要先将其转换为字符串或整数。例如

Encoding.Unicode.GetString(ba)

您也可以从 EF 调用 SP。:-)

于 2012-10-12T15:21:24.373 回答
0

使用 EntitySQL。

// Drop down to ObjectContext and query against ObjectSet:
var objectContext = (dbContext as IObjectContextAdapter).ObjectContext;
// Create param for EntitySQL
var param = new ObjectParameter("rowVersion", rowVersion);
// Create IQueryable<T>
var query = objectContext.CreateObjectSet<T>.Where("it.RowVersion > @rowVersion",param);
于 2013-11-15T15:29:17.947 回答