深入选择多个级别

我可以使用SelectMany在集合中展平子集合的结果:

// a list of Foos, a Foo contains a List of Bars var source = new List() { ... }; var q = source.SelectMany(foo => foo.Bar) .Select(bar => bar.barId) .ToList(); 

这给了我Foo列表中所有Bar ID的列表。 当我尝试深入三级时,返回错误的结果。

  var q = source.SelectMany(foo => foo.Bar) .SelectMany(bar => bar.Widget) .Select(widget => widget.WidgetId) .ToList(); 

我应该如何使用SelectMany获取Foos列表中所有条形图中所有小部件的列表?

编辑我错过了上面的句子,但代码反映了目标。 我正在寻找所有Widget ID的列表,而不是小部件。

“不正确”的结果并非返回所有窗口小部件ID。

您的查询返回所有窗口小部件ID,而不是所有窗口小部件。 如果您只想要小部件,只需使用:

 var q = source.SelectMany(foo => foo.Bar) .SelectMany(bar => bar.Widget) .ToList(); 

如果仍然给出“不正确的结果”,请以何种方式解释这是不正确的结果。 示例代码非常有用:)

编辑:好的,如果你想要小部件ID,你的原始代码应该没问题:

 var q = source.SelectMany(foo => foo.Bar) .SelectMany(bar => bar.Widget) .Select(widget => widget.WidgetId) .ToList(); 

那也可以写成

 var q = (from foo in source from bar in foo.Bar from widget in bar.Widget select widgetId).ToList(); 

如果你喜欢查询表达格式。

这确实应该有效 – 如果它不起作用,那表明你的数据有问题。

我们之前应该检查过 – 这只是LINQ to Objects,还是一个更高级的提供者(例如LINQ to SQL)?

 var q = ( from f in foo from b in f.Bars from w in b.Widgets select w.WidgetId ).ToList(); 

另请注意,如果您需要唯一列表,则可以执行.Distinct()。ToList()。

  var q = source.SelectMany(foo => foo.Bar) .SelectMany(bar => bar.Widget,(bar,widget) => widget.WidgetId) .ToList(); 

我们可以调用SelectMany()的这个重载,允许我们使用lambda experession指定投影