2015-11-06 179 views
0

我目前對我的一個項目使用Linq to Sql(dbml)。 (C#贏形式)Linq等於運算符

我創建的部分和元數據類模塊,並實現equals()和基於these Guidelines

我有問題== 是,當我嘗試使用這些等於操作在linq查詢中。

Entities.MyClass.Where(p => p.Equals(myClassObject)); 

我也嘗試以下

Entities.MyClass.Where(p => Object.Equals(p, myClassObject)); 
Entities.MyClass.Where(p => p == myClassObject); 

什麼是實現這個的最佳方式?

而是試圖重載equals目前我正在做以下的(但我檢查8個值,所以它只是似乎很麻煩):

Entities.MyClass.Where(p => p.value1 == myClassObject.value1 && p.value2 == myClassObject.value2 ......) 
+0

究竟是什麼問題?你是否遇到錯誤,或者你不想檢查8個值? –

+0

我比較'Objects'時總是使用經驗法則比較值時使用'.Equals'方法我使用'=='比較 – MethodMan

+1

我假設問題是您的Linq提供程序不知道如何轉換您爲實體設置的'Equals'或'=='運算符。通常情況下,您會與主鍵進行比較,除非您專門測試與某些列集匹配的行。 – juharr

回答

3

的LINQ to SQL(或任何其他LINQ提供程序將你的LINQ表達式翻譯成針對這個問題的提供者查詢),並不知道你如何覆蓋Equals

因此,當您在LINQ查詢中使用Equals方法時,提供程序不知道它應該使用您的8個屬性進行比較。

您可以在LINQ提供程序處理LINQ查詢之前,通過遍歷表達式樹並將調用擴展到您的Equals方法到相應的8屬性比較中來預處理您的LINQ查詢。這樣,LINQ提供程序就會爲您的實現獲取一個表達式。如果equals實現更改,則只需在兩個位置(Equals重寫和相應的替換表達式)進行更改。

+0

我將如何去預處理LINQ,我只對LINQ有限的知識,主要是使用它,所以我不需要編寫SQL查詢,所以我可以輕鬆地進行數據綁定而無需創建自己的類。有沒有可以指引我的資源?谷歌「預處理Linq查詢」到目前爲止並不是很有幫助。 –

+0

另外我目前只檢查一次是否相等,檢查8個屬性並忘記覆蓋和預處理更簡單嗎?我想爲未來可能的變化建立覆蓋面,但似乎我只是自己動手。 –

+1

如果這只是在一個地方,那麼檢查8個屬性可能是有意義的。否則,你最終將不得不遍歷和修改表達式樹,這可能是一個挑戰性的選擇。如果你仍然感興趣的話,有一些解決方案可以提供一個實現這種*可擴展*查詢的框架,例如http://tomasp.net/blog/linq-expand.aspx。 –

0

您必須創建一個Expression<Func<M,V>>對象以傳遞給where子句。您可以將方法中的this問題的答案放入方法中,並以此方式進行創建。