2012-10-02 82 views
8

如何使用實體框架比較rowversion字段?我有一個表有一個rowversion列,我想從表格中獲取數據的行版本高於指定值。實體框架中的Rowversion比較

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

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

此行不起作用,它拋出錯誤:

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

任何想法,我怎麼能比較C#/ EF rowversion領域?

+2

使用rowversion列,基本上只能檢查是否相等(或不等於) - 您無法真正測試「大於」與否。 –

+0

@marc_s我也這麼認爲,但實際上,仔細一看,[文檔](http://msdn.microsoft.com/en-us/library/ms182776.aspx)提到rowversion值越來越多,它支持觀察到rowversion可以被視爲一個64位的整數,稍後更高的值被插入到數據庫中,並且它是一個64位整數,這意味着沒有現實的溢出機會。 – hvd

回答

0

你確定這是猶太人使用的RowVersion?當它翻轉時會發生什麼?

我想你需要先將它轉換爲字符串或int。例如

Encoding.Unicode.GetString(ba) 

您也可以從EF調用SP。 :-)

0

使用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

這是我們做的,以解決這個問題:

使用比較擴展這樣的:

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

相關問題