2012-10-02 39 views
8

Tôi nên so sánh các trường rowversion bằng cách sử dụng Khung thực thể như thế nào? Tôi có một bảng có cột rowversion, tôi muốn lấy dữ liệu từ các bảng có phiên bản hàng nào cao hơn giá trị được chỉ định.So sánh hàng trăm trong Khuôn khổ thực thể

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

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

Dòng này không hoạt động, nó throws lỗi:

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

Bất kỳ ý tưởng làm thế nào tôi có thể so sánh rowversion trường trong C#/EF?

+2

Với cột hàng tuần, về cơ bản bạn chỉ có thể kiểm tra tính bình đẳng (hoặc không bình đẳng) - bạn không thể thực sự kiểm tra "lớn hơn" hay không. –

+0

@marc_s Tôi cũng nghĩ như vậy, nhưng thực sự, hãy xem kỹ hơn, [tài liệu] (http://msdn.microsoft.com/en-us/library/ms182776.aspx) nói về các giá trị chuyển tiếp tăng dần, hỗ trợ quan sát rằng một rowversion có thể được coi như một số nguyên 64 bit, và các giá trị cao hơn đã được chèn vào cơ sở dữ liệu sau đó, và nó là một số nguyên 64 bit có nghĩa là không có cơ hội thực sự tràn. – hvd

Trả lời

0

Bạn có chắc chắn rằng Kosher sử dụng RowVersion không? Điều gì xảy ra khi nó cuộn qua?

Tôi nghĩ bạn sẽ cần phải chuyển đổi nó thành chuỗi hoặc int trước tiên. ví dụ:

Encoding.Unicode.GetString(ba) 

Bạn cũng có thể gọi SP từ EF. :-)

0

Sử dụng 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

Đây là những gì chúng tôi đã làm để giải quyết này:

Sử dụng một so sánh mở rộng như thế này:

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

Sau đó, bạn có thể làm

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

Lý do làm việc này mà không cần triển khai C# là vì phương pháp mở rộng so sánh không bao giờ thực sự được gọi và EF LINQ đơn giản hoá x.compare(y) > 0 xuống x > y

Các vấn đề liên quan