Сравнение 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);
Другие вопросы по тегам