Сравнение Rowversion в Entity Framework
Как мне сравнивать rowversion
поля с использованием Entity Framework? У меня есть одна таблица, которая имеет rowversion
столбец, я хочу получить данные из таблиц, для которых версия строки выше, чем указанное значение.
//code
byte[] rowversion = .....somevalue;
_context.Set<T>().Where(item => item.RowVersion > rowVersion);
Эта строка не работает, выдает ошибку:
не может быть применен к операндам типа 'byte[]' и 'byte[]'
Любая идея, как я могу сравнить rowversion
поля в C#/EF?
3 ответа
Вот что мы сделали, чтобы решить эту проблему:
Используйте расширение сравнения следующим образом:
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#, заключается в том, что метод расширения сравнения никогда не вызывается, а EF LINQ упрощает x.compare(y) > 0
до x > y
Вы уверены, что это кошерное использование RowVersion? Что происходит, когда он переворачивается?
Я думаю, вам нужно будет сначала преобразовать его в строку или int. например
Encoding.Unicode.GetString(ba)
Вы также можете позвонить ИП от EF.:-)
Используйте 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);