如何用C# LINQ将Product数据转换为ProductwithCategory模型?
实现Product到ProductwithCategory的LINQ转换
原模型与输入数据
Product类定义
public class Product { public int ProductId { get; set; } public string CategoryName { get; set; } public string CategoryValue { get; set; } }
输入JSON数据
[ { "productId": 1, "categoryName": "A", "categoryValue": "AV" }, { "productId": 1, "categoryName": "B", "categoryValue": "BV" }, { "productId": 1, "categoryName": "C", "categoryValue": "CV" }, { "productId": 2, "categoryName": "B", "categoryValue": "BV" }, { "productId": 3, "categoryName": "C", "categoryValue": "CV" } ]
目标模型与预期输出
ProductwithCategory类定义
public class ProductwithCategory { public int ProductId { get; set; } public Dictionary<string, string> allCategoriesWithvalue { get; set; } = new Dictionary<string, string>(); }
预期输出JSON结构
[ { "productId": 1, "allCategoriesWithvalue": { "A": "AV", "B": "BV", "C": "CV" } }, { "productId": 2, "allCategoriesWithvalue": { "A": "", "B": "BV", "C": "" } }, { "productId": 3, "allCategoriesWithvalue": { "A": "", "B": "", "C": "CV" } } ]
LINQ实现代码
// 获取所有不重复的分类名称 var allCategoryNames = products.Select(p => p.CategoryName).Distinct().ToList(); // 分组转换为目标模型 var result = products .GroupBy(p => p.ProductId) .Select(g => new ProductwithCategory { ProductId = g.Key, allCategoriesWithvalue = allCategoryNames .ToDictionary( category => category, category => g.FirstOrDefault(p => p.CategoryName == category)?.CategoryValue ?? "" ) }) .ToList();
代码说明
- 先提取所有存在的分类名称并去重,保证每个产品的字典都包含全部分类键。
- 按
ProductId分组,将同一产品的多条分类记录聚合到一组。 - 对每个分组构建目标字典:遍历全部分类名称,匹配当前分组中对应分类的值,无匹配则填充空字符串。
内容的提问来源于stack exchange,提问作者user547534
相关产品推荐
相关产品推荐

