LinQ嵌套集合查询

时间:2012-07-11 11:02:33

标签: c# linq collections nested

我是Linq的新手,无法解决以下问题。尝试在互联网上检查很多,但没有得到正确的答案。

我有以下查询:

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

Categories是包含id和name的对象的集合。这里的集群是键和值对的字典。执行此查询时出现以下错误:

  

无法创建类型为'System.Collections.Generic.KeyValuePair`2'的常量值。   在此上下文中仅支持原始类型(例如Int32,String和Guid')。

另一个选项是为包中的每个类别添加一个for循环。有更清洁的方法吗?

2 个答案:

答案 0 :(得分:3)

您是否尝试使用Dictionary.ContainsKey方法进行查询?

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

答案 1 :(得分:0)

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

如果您希望每个包只在结果中一次。 它也更有效,因为在你的问题中ContainsKey是O(1)而不是O(Clusters.Count)。