2014-10-03 55 views
1

我有下一個實體:C#LINQ加入三甲之列,以嵌套的字典

public class product 
    { 
     public string ID {get;set;} 
     public string Code { get; set; } 
    } 

    public class subProduct 
    { 
     public string Code { get; set; } 
     public string productID { get; set; } 
    } 

    public class AddValueForSubProduct 
    { 
     public string subProductCode { get; set; } 
     public string AddValue { get; set; } 
    } 

,我想從這個集都Dictionary<string*, Dictionary<string**,string***>>

 List<product> products = GetProducts(); 
     List<subProduct> subProducts = GetSubProducts() ; 
     List<AddValueForSubProduct> vForSubProd = GetAddValueForSubProduct(); 

其中:

Dictionary<string*, Dictionary<string**,string***>> 
       * product.Code 
       ** subProduct.Code 
       *** AddValueForSubProduct.AddValue 

我想,但我已經收到關於字典中重複鍵的異常。

var res = from p in products 
         join sb in subProducts on p.ID equals sb.productID into sbs 
         from c in sbs 
         join vF in vForSubProd on c.code equals vF.subProductCode into addingData 
         select new KeyValuePair<string, Dictionary<string, string>>(p.code, addingData. 
         ToDictionary(v => v.subProductCode, v => v.AddValue)); 

回答

4

而不是試圖和應對加入數據的加入到一個查詢字典所有的結果映射,它更容易只是創建代碼和子代碼的查找到相關的清單來代替。

創建查找是很容易的:

var subProductLookup = subProducts.ToLookup(sub => sub.Code); 
var valueLookup = vForSubProd.ToLookup(value => value.subProductCode); 

與這些查找你現在可以每個產品的子產品代碼列表的ToDictionary調用中映射同時,各子產品映射到所有的價值。值得注意的是,在技術上,每個子產品可能有多個值,因此您需要選擇一個(如第一個)或更改最內部的字典以查找值集合,而不是單個值。

var dictionary = products.ToDictionary(
    product => product.Code, 
    product => subProductLookup[product.Code] 
     .ToDictionary(
      sub => sub.Code, 
      sub => valueLookup[sub.Code].First().AddValue));