如何将数据库装载数据转换为指定嵌套类 能否通过单次投影实现
问题解答
单次投影实现方案
可以通过单次投影完成转换,使用嵌套的GroupBy+LINQ投影操作即可实现,无论是EF Core数据库查询还是内存集合处理都支持,全程只需要遍历一次原始数据/执行一次数据库查询。
以下是实现代码示例,假设你的原始数据实体类名为LorryLoadRecord,对应的数据库表DbSet命名为LorryLoadRecords:
var result = new View { Report = context.LorryLoadRecords // 第一层按货车ID分组 .GroupBy(record => record.Lorryid) .Select(lorryGroup => new LorryLoading { LorryId = lorryGroup.Key, // 第二层按商品ID分组 Product = lorryGroup.GroupBy(record => record.productid) .Select(productGroup => new Product { ProductId = productGroup.Key, // 按类型分别求和数量 Qty0 = productGroup.Where(r => r.qtytype == 0).Sum(r => r.Qty), Qty2 = productGroup.Where(r => r.qtytype == 2).Sum(r => r.Qty), Qty3 = productGroup.Where(r => r.qtytype == 3).Sum(r => r.Qty), // 收集所有有效备注 Comments = productGroup.Where(r => r.iscomment == "t" && !string.IsNullOrEmpty(r.comment)) .Select(r => r.comment) .ToList() }).ToList() }).ToList() };
如果是EF Core 3.0及以上版本,上述代码可以被正确翻译为SQL语句,只会执行一次数据库查询,完全符合单次投影的要求。如果是内存集合操作,也只会遍历一次原始数据完成所有聚合。
常见列表赋值问题原因
你遇到的列表赋值报错,大概率是以下两种原因:
- 分组层级错误,没有先按货车ID分组再嵌套按商品ID分组,直接全局按商品ID分组导致归属关系错乱
- 聚合操作漏了过滤条件,比如未按
qtytype过滤就直接求和,或者收集备注时漏了非空判断
学习资源推荐
- 微软官方LINQ、EF Core文档,覆盖了从基础投影到复杂分组聚合的所有操作说明,还有查询翻译的注意事项,内容权威且场景全面
- 《C#高级编程》中LINQ相关章节,有大量真实业务场景下的复杂数据转换实操案例
- Stack Overflow的
linq-groupby标签下的高赞问题,大多是实际开发中遇到的复杂转换需求,可以参考高赞回答的实现思路
内容的提问来源于stack exchange,提问作者Lukasz Pomianowski
相关产品推荐
相关产品推荐

