2014-10-03 35 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));