Linq SelectMany用法

时间:2013-10-01 00:49:31

标签: c# linq

我无法针对以下情况提出linq查询。

public class Product
{
    public virtual string ProductName { get; set; }
    public virtual IList<SubProduct> SubProducts { get; set; }
}

public class SubProduct
{
    public string SubProductName { get; set; }

    public int SubProductTypeId { get; set; }
}

public class SubProductType
{
    public int SubProductTypeId{ get; set; }
    public string Description { get; set; }
}

var productList = List<Product>();

var subProductTypeLlist = List<SubProductType>();

我有一个产品清单,每个产品都有子产品清单。我想让查询代表{ProductName,Description}。请建议如何编写linq查询。

1 个答案:

答案 0 :(得分:1)

这样的事情可以解决问题:

var result = productList
    .SelectMany(p => p.SubProducts
        .Select(sp => new { SubProduct = sp, ProductName = p.ProductName }))
    .Select(sp => 
        new { Description = subProductTypeList
            .Single(spt => spt.SubProduct.SubProductTypeId == sp.SubProductTypeId).Description,
            ProductName = sp.ProductName })

在SelectMany中,我们首先对内部IEnumerable(IList实现IEnumerable)执行Select操作,将每个SubProduct对象转换为包含SubProduct对象和ProductName的匿名类。然后,SelectMany将其转换为平面列表。然后我们使用该列表上的Select再次创建一个新的匿名类,这次我们从subProductTypeList中获取Description。结果是具有成员Description和ProductName的匿名类的IEnumerable。