2012-07-11 98 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