2012-07-11 254 views
0

我是Linq的新手,無法解決以下問題。嘗試了很多在互聯網上,但沒有得到正確的答案。LinQ嵌套收集查詢

我有以下查詢:

var packages = from p in Packages 
       from cl in p.Categories 
       from temp in Clusters 
       where (cl.Id == temp.Key) 
       select p; 

分類是一個包含ID和名稱對象的集合。這裏的集羣是關鍵字和值對的字典。執行此查詢時出現以下錯誤:

無法創建類型爲'System.Collections.Generic.KeyValuePair`2的常量值。 在此上下文中僅支持基本類型(如Int32,String和Guid)。

另一種選擇是爲包中的每個類別的每個循環添加一個。有沒有更乾淨的方法來做到這一點?

+0

在您的字典中。密鑰的類型是什麼。價值的類型是什麼。你能否提供你的示例中Packages,Categories&Clusters的定義。 – 2012-07-11 11:16:56

回答

0
var packages = Packages.Where( 
        p => p.Categories.Any( 
        c => Clusters.ContainsKey(c.Id))); 

如果你只想在一次結果每個包。 它也更有效率,因爲在你的問題中ContainsKey是O(1)而不是O(Clusters.Count)。

+0

謝謝,這個工作,但我不得不實現序列成一個列表和枚舉ForEach爲每個包。 :( – PRE 2012-07-11 14:02:23

3

您是否使用Dictionary.ContainsKey方法試過了查詢?

var packages = from p in Packages 
       from cl in p.Categories 
       where Clusters.ContainsKey(cl.Id) 
       select p; 
+0

謝謝Vedran,恐怕這可能不是解決辦法。問題是如何「交叉」這兩個集合,即類別和集羣。如果該包的交點包含一些對象,那麼我選擇該包。我無法把它放在一個更乾淨的語法中。\ – PRE 2012-07-11 11:52:37

+0

代碼將會做到這一點。通過使用ContainsKey方法,您不必遍歷字典。 – Vedran 2012-07-11 11:56:22