2010-04-19 85 views
0

我有一個小問題,我無法解決。 我想在Linq中使用SQL-In-Statement。我已經在這個論壇和其他論壇上讀過我必須使用.Contains(帶有逆向思考符號:-))。 作爲輸入,我有一個Guid列表。我第一次複製他們到一個數組,然後做類似的東西:問題與包含

datatoget = (from p in objectContext.MyDataSet 
      where ArrayToSearch.Contains(p.Subtable.Id.ToString()) 
      select p).ToList(); 

datatoget是在匹配Subtable.Id(這是一個GUID)的所有記錄應保存的結果。 Subtable是MyData的Detail-Table,Id是Guid-Type。 我已經試過幾件事情(轉換的GUID的字符串,然後使用。載等), 但我總是得到一個異常,說:

「LINQ到實體」不能識別方法「布爾包含(System.Guid)和 無法將此方法轉換爲內存表達式。 (類似的東西,因爲我使用VS2008的德國版)

我使用與.NET 3.5 L2E和C#與VS AM程序2008

我讀過幾個例子,但它不起作用。這可能是因爲使用Guid而不是字符串? 我也試圖寫我自己的比較函數,但我不知道如何將它集成,以便.NET調用我的函數進行比較。

+3

另請參見http://stackoverflow.com/questions/374267/contains-workaround-using-linq-to-entities – 2010-04-19 14:57:40

+0

羅伯特是正確的這是一個3.5的副本,但也4.0直接支持'包含()'。 – 2010-04-19 16:11:49

回答

0

您可以在arrayToSearch上使用Any()嗎?

datatoget = objectContext 
       .MyDataSet 
       .Where(p => arrayToSearch.Any(i => i == p.Subtable.Id.ToString()) 
       .ToList(); 

善良,

0

我會嘗試這兩種方法:

第一種方法:不轉換任何東西。這假定p.Subtable.Id在數據庫中被定義爲GUID。

Guid[] guids = GetGuids(); 

var dataToGet = (from p in objectContext.MyDataSet 
       where guids.Contains(p.Subtable.Id) 
       select p).ToList(); 

第二種方法:首先將所有GUID轉換爲字符串。

string[] guids = GetGuids().Select(g => g.ToString()).ToArray(); 

var dataToGet = (from p in objectContext.MyDataSet 
       where guids.Contains(p.Subtable.Id.ToString()) 
       select p).ToList(); 

如果這些都不能正常工作,那麼我們可能需要看到更多信息有關的問題,如數據庫的模式,實體的形狀等

0

感謝您花時間在我的問題上。來自Robert Havery的鏈接:) 正如我所看到的.Contains()對Linq for Entities和.NET3.5不起作用(很好)。 如果不編寫擴展方法,就不可能做到這一點。 我試了一下LinqPad,當使用Linq 2 SQL時,.Contains()沒有問題。它按承諾做到了。 Linq to Entities沒有承諾,除了我總是得到Exception(但這也是一個承諾:))。

特別感謝Robert Havery和所有幫助過我的人。

+0

正如Robert的鏈接所顯示的那樣,您可以使用3.5中的擴展方法進行操作。 – 2010-04-20 13:19:37