2013-01-13 25 views
3

請幫助我。 我嘗試在.Where()查詢方法中比較兩個guid。但我得到編譯錯誤。 錯誤1操作 '>' 不能被施加到型 「的System.Guid」 的操作數和「的System.GuidGUID類型和('>'大於比較)在LINQ to SQL

Guid startUser = ////Here I get user by url id param 
List<Friends> friends = Common.DataContext.Friends.Where(u => u.FriendID > startUser).Take(5); 
+3

爲什麼你甚至試圖比較的GUID? – MarcinJuraszek

+1

到目前爲止,您正在描述一個問題,但您並未提出問題。這是一個問答網站;如果你提問*,你會得到更好的結果。 * Guid不打算訂購*,所以你得到一個錯誤的事實是*好*。 Guids僅用於身份對比。你試圖基於guid命令是一個紅旗,表明你可能會濫用guid。退一步,問這是否真的是你想要訂購。 –

+3

我的一系列關於正確和錯誤使用GUID的文章從這裏開始:http://blogs.msdn.com/b/ericlippert/archive/2012/04/24/guid-guide-part-one.aspx它可能會幫你。 –

回答

2

並與:

u.FriendID.CompareTo(startUser) > 0 

+0

這很可能不適用於「LINQ to SQL」我知道它不起作用在NHibernate中。僅僅因爲在代碼中運行並不意味着它知道如何將其轉換爲數據庫查詢。 –

-2

一點也沒有」不適用於大於或小於Guid。

0f8fad5b-d9cb-469f-a165-70867728950e and 7c9e6679-7425-40de-944b-e07fc1f90ae7

兩個Guids但哪個更大?你放棄 - 並計算HEX的總數?或者如何在HEX之間添加 - 的總和?

它只是簡單地沒有這樣做(儘管它可能是)

應用邏輯==和!=但是沒有任何意義,但。的GUID結構不超載==和!=操作符,所以使用它們,你也可以很容易地比較兩個字符串值,即

var isEqual = guid.ToString().Equals(otherGuid.ToString());

+0

另外... GUID往往是系統生成沒有明確的序列,所以除非你是由於某些原因產生序列GUID什麼是要說>或<?如果一個比另一個大或小,它有什麼關係? –

+0

'Guid'結構會重載'=='和'!='操作符,因此請使用它們。如果你使用'Equals(...)',不要把一個字符串引用與一個(盒裝的)'Guid'值進行比較;他們永遠不會平等。 –

+0

修改爲國家otherGuid是一個字符串(誤導),並感謝澄清操作符重載存在於Guid @JeppeStigNielsen –

0

我知道這是一個老問題,但我已經看到了在此之前數據情況,這可能與未來某個人有關。 這可能與您出於某種原因在唯一標識符上聚集您的表(物理組織,帶有主鍵的缺省值)相關。如果您需要批量讀取或網頁的表格,你可以用閱讀SQL查詢結束:

SELECT TOP (@batchsize) 
    * 
FROM myTable 
WHERE UserId > @previousBatchUserId 

也就是說,一般不是一個很理想的設計,正如你所觀察到不LINQ-工作到SQL。另外,如果在添加更多行後稍後執行相同的查詢,批次中的內容將會更改。如果你有一個CreatedDate(time)列,那麼排序會好很多。或者使用創建的日期列作爲第一個標準,然後對GUID進行檢查(如果可以使用相同的郵票創建多個)。 理想情況下,您應該添加一個代理標識列(以及其上的集羣),然後您可以在該標識符所在的位置篩選大於與所需GUID相對應的ID。

它可能然後看起來像:

Guid startUser = //some guid 
int startUserId = Common.DataContext.Friends.Single(u => u.FriendID == startUser).Id; 
List<Friends> friends = Common.DataContext.Friends.Where(u => u.Id > startUserId);