Rowversion comparison in Entity Framework

╄→гoц情女王★ 提交于 2019-12-04 19:32:56

问题


How should I compare rowversion fields using Entity Framework? I have one table which has a rowversion column, I want to get data from tables for which the row version is higher than specified value.

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

This line does not work, it throws the error:

Operator '>' cannot be applied to operands of type 'byte[]' and 'byte[]'

Any idea how I can compare rowversion fields in C#/Entity Framework?


回答1:


Here is what we did to solve this. Use a compare extension like this:

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");
    }
}

Then you can do this:

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

The reason this works without a C# implementation is because the Compare extension method is never actually called, and EF LINQ simplifies x.Compare(y) > 0 down to x > y.




回答2:


Are you sure that is Kosher use of RowVersion ? What happens when it rolls over ?

I think you will need to convert it to string or int first. eg

Encoding.Unicode.GetString(ba)

You can also call SPs from EF. :-)




回答3:


Use 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);


来源:https://stackoverflow.com/questions/12693934/rowversion-comparison-in-entity-framework

工具导航Map