Linq中的子查询作为列表联合

时间:2018-10-24 07:03:53

标签: c# linq collections

想象一下,您拥有Voyage类的Tally类。这个Tally类具有Shipment类的集合。我正在尝试获取所有Tallies类的列表作为工会发货清单。
我已经对此进行了编码:

var shipments = booking.Voyages.Select(q => q.Tallies.Select(t => t.Loadings.Select(l=>l.Shipment))).ToList();

但是问题是它以List<IEnumerable<IEnumerable<Shipment>>>的形式返回结果,而我期望以IEnumerable<Shipment>的形式出现。

有没有解决此问题的方法,或者我必须使用for循环来获取其发货。

1 个答案:

答案 0 :(得分:1)

您需要SelectMany函数。 SelectMany会将嵌套的IEnumerable<IEnumerable<T>>;展平为所有孩子中的IEnumerable<T>。因为您处于多个级别,所以您将需要多个SelectMany

var shipments = booking.Voyages.SelectMany(
                  q => q.Tallies.SelectMany( 
                      t => t.Loadings.SelectMany(l=>l.Shipment)
                   )
                 ).ToList();

如果Shipment属性是单个对象导航属性,而不是集合,则需要以下代码。

var shipments = booking.Voyages.SelectMany(
                  q => q.Tallies.SelectMany( 
                      t => t.Loadings.Select(l=>l.Shipment)
                   )
                 ).ToList();