2013-10-01 63 views
0

我无法为以下情形提出linq查询。Linq SelectMany用法

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

像这样的东西应该做的伎俩:

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)每个子产品对象转换为匿名类控股子产品对象和ProductName。 SelectMany然后将其转换为平面列表。然后我们在该列表上使用Select来再次创建一个新的匿名类,在这个时候,我们从subProductTypeList中获取Description。结果是具有成员Description和ProductName的匿名类的IEnumerable。

+0

非常感谢您的快速回复和帮助。我根据需要修改了结果查询,现在正在工作。 var products = new List(); var subProductTypeList = new List(); var typeListMap = subProductTypeList.ToDictionary(x => x.SubProductTypeId,x => x.Description); var results = productList.SelectMany(p => p.SubProducts,(t,i)=> new {ProductName = t.ProductName,Description = typeListMap [i.SubProductTypeId]})。 – user1837788