我有下一个实体:
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));
答案 0 :(得分: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));