2013-07-13 62 views
0

我有一個非常直接的查詢,它在運行時產生這個錯誤:String.Contains方法只支持客戶端可以評估的參數。使用包含在Linq查詢中會產生錯誤

查詢應該只查找分配給它們的轉移類別。轉移可以列在幾個類別中,因此不存在表關係。 Categoryidhash包含「7〜34〜25〜42〜47」等數據。我剛剛意識到這一點,搜索'7'將返回多個結果,「7」&'47'等等這就好了,我只是改變ID的所有雙位數。同時...

我該如何解決這個問題?

Private Function GetCategoryList() As List(Of Category) 
    Dim lst As List(Of Category) = New List(Of Category) 

    Using db As New IPCDataDataContext 

     lst = (From c In db.Categories 
       From t In db.Transfers 
       Where t.CategoryIDhash.Contains(c.ID.ToString) 
       Select c).ToList() 
     Return lst 
    End Using 
End Function 
+0

*「我剛剛意識到在寫這篇文章時,搜索'7'會返回多個結果,」7「和'47'等等。那好吧我只需要將id改爲全部兩位數。」* **本身就是一個跡象表明你正在做錯誤的方法**正常的做法是建立一個連接,並將每個(在你的情況下)類別ID存儲在一個單獨的表中,該表中有一個外鍵關係(看起來像在你的情況)轉移表。如果你將來需要超過99個類別,該怎麼辦?我不知道如何編寫Linq-to-SQL代碼,但你真的應該研究它。 –

回答

0

異常意味着Contains只接受可以在SQL被轉換爲固定的可變參數。所以像Where t.CategoryIDhash.Contains(someVariable.ToString)將是可能的,因爲someVariable.ToString可以評估客戶端。

我不明白這個限制,因爲在SQL中,完全可以使用LIKE子句和SQL語句本身內置的字符串。這是由解決您的問題聲明證實:

lst = (From c In db.Categories 
     From t In db.Transfers 
     Where SqlMethods.Like(t.CategoryIDhash, "%" + c.ID.ToString "%") 
     Select c).ToList() 

這會產生(並執行)SQL像

... 
WHERE [t1].[CategoryIDhash] LIKE (@p0 + (CONVERT(NVarChar,[t0].[ID]))) + @p1 

(其中@p0@p1%字符

雖然你可以做到這一點,我想知道你是否在正確的軌道上使用這CategoryIDhash。我想你應該把它轉換成FK關係(如果它在你的手中來修改數據庫)

+0

謝謝@Gert的解釋,然而它沒有產生我正在尋找的結果,我收到了一些空的類別。如何正確地創建這兩個表格之間的關係,以便我可以將轉移分爲幾類? – DoImagine

+0

你是什麼意思_dupes空類別_?我想你也應該檢查'&& t.CategoryIDhash.Length> 0'。 –

+0

對不起,我沒有明確的查詢,它是返回倍數。我知道這種方法可能不是處理這種情況的最佳方式,但是,將第三張表格鏈接起來是更好的方法嗎?說完之後,它將成爲一張巨大的桌子。 – DoImagine