【问题标题】:LinQ nested collection queryLinQ 嵌套集合查询
【发布时间】:2012-07-11 11:02:32
【问题描述】:

我是 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 each 循环。有没有更清洁的方法来做到这一点?

【问题讨论】:

  • 在你的字典里。密钥的类型是什么。值的类型是什么。您能否在示例中提供包、类别和集群的定义。

标签: c# linq collections nested


【解决方案1】:

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

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

【讨论】:

  • 感谢 Vedran,恐怕这不是解决方案。问题是如何在这里“交叉”两个集合,即类别和集群。如果该包的交集包含一些对象,那么我选择该包。我无法将其放在更简洁的语法中。\
  • 代码会做到这一点。通过使用 ContainsKey 方法,您不必遍历字典。
【解决方案2】:
var packages = Packages.Where( 
                   p => p.Categories.Any( 
                   c => Clusters.ContainsKey(c.Id)));

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

【讨论】:

  • 谢谢,这行得通,但我必须将序列实现为 List 并使用 ForEach 对每个包进行枚举。 :(
猜你喜欢
  • 2010-10-17
  • 1970-01-01
  • 2011-02-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多