2012-10-02 11 views
8

¿Cómo debo comparar los campos rowversion usando Entity Framework? Tengo una tabla que tiene una columna rowversion, quiero obtener datos de tablas para las cuales la versión de fila es más alta que el valor especificado.Comparación de Rowversion en Entity Framework

//code 
byte[] rowversion = .....somevalue; 

_context.Set<T>().Where(item => item.RowVersion > rowVersion); 

Esta línea no funciona, se lanza de error:

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

Cualquier idea de cómo puedo comparar rowversion campos en C#/EF?

+2

Con la columna de rowversion, básicamente solo se puede verificar la igualdad (o no igualdad); no se puede probar realmente para "mayor que" o no. –

+0

@marc_s Yo también pensé lo mismo, pero en realidad, si miramos más de cerca, [la documentación] (http://msdn.microsoft.com/en-us/library/ms182776.aspx) habla de valores de rowversion que se incrementan, lo que respalda la observación de que una conversión de fila puede tratarse como un entero de 64 bits, y valores más altos se han insertado en la base de datos más tarde, y que es un entero de 64 bits significa que no hay posibilidades realistas de desbordamiento. – hvd

Respuesta

0

¿Estás seguro de que es el uso Kosher de RowVersion? ¿Qué pasa cuando se da vuelta?

Creo que primero tendrá que convertirlo en cadena o int. por ejemplo,

Encoding.Unicode.GetString(ba) 

También puede llamar a los SP de EF. :-)

0

Utilice 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); 
1

Aquí es lo que hicimos para resolver esto:

utilizar una extensión de comparar de esta manera:

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

A continuación, puede hacer

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

La razón de que esto funciona sin una implementación de C# se debe a que el método de extensión de comparación nunca se llama realmente, y EF LINQ simplifica x.compare(y) > 0 hasta x > y