10

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?

CarenRose
  • 1,142
  • 11
  • 18
bhavesh lad
  • 1,122
  • 1
  • 11
  • 23
  • 2
    With rowversion column, you can basically only check for equality (or non-equality) - you cannot really test for "larger than" or not. – marc_s Oct 02 '12 at 16:16
  • 1
    @marc_s I thought so too, but actually, taking a closer look, [the documentation](http://msdn.microsoft.com/en-us/library/ms182776.aspx) speaks of rowversion values getting incremented, which supports the observation that a rowversion can be treated as a 64-bit integer, and higher values have been inserted into the database later, and it being a 64-bit integer would mean there is no realistic chance of overflow. –  Oct 02 '12 at 16:32

3 Answers3

6

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.

Per Lundberg
  • 2,931
  • 1
  • 29
  • 39
Damon Warren
  • 422
  • 3
  • 6
1

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. :-)

phil soady
  • 10,013
  • 4
  • 44
  • 82
  • 1
    Even if you could sustain 1 million inserts/updates per second for that one table continuously, it would roll over in about 584 thousand years if my math is right. – Paul May 31 '19 at 18:51
0

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);
Pavel Voronin
  • 11,811
  • 6
  • 54
  • 113