You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将数据库装载数据转换为指定嵌套类 能否通过单次投影实现

问题解答

单次投影实现方案

可以通过单次投影完成转换,使用嵌套的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 19:36:03