2013-10-01 65 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