SQL 结果到具有子对象的复杂对象

Posted

技术标签:

【中文标题】SQL 结果到具有子对象的复杂对象【英文标题】:SQL result to complex object with children 【发布时间】:2021-07-29 08:58:00 【问题描述】:

我们正在寻找一种更有效的方法来构建具有完整父/子关系的对象,而不是循环遍历单独查询的结果并将子级分配给父级。现在这似乎是我们代码中的一个大瓶颈(我们经常需要一次处理 1,000 到 1,000,000 个实体。

有没有办法使用带有db.Database.SqlQuery<Parent>("SELECT * FROM xyz) 的查询来返回父/子/孙关系?

public class Parent

    public int Id  get; set; 
    public string Name  get; set; 
    public List<Child> Children  get; set; 


public class Child

    public int Id  get; set; 
    public List<Grandchild> Grandchildren  get; set; 


public class Grandchild

    public int Id  get; set; 

【问题讨论】:

你考虑过使用实体框架吗? 在 Dapper 中,您可以执行 QueryMultiple,它可以提取多个结果集。它还有splitOn,可以将单个结果集拆分为多个对象 我们正在使用 EF,但它执行的查询有时非常慢,或者当我们可以使用像这样的常规 SQL 查询来完成时,它会创建许多到数据库的往返。 @Ali 因为我们可以将查询结果转换为 ViewModel 我们能够设置 ViewModel 的其他属性,例如父 ID 等,这对我们正在做的事情非常有帮助'没有 EF 查询 【参考方案1】:

使用 EF 你可以做这样的事情

db.Parent.Include(e=> e.Child).Include(e=> e.Child.SelectMany(s=> s.Grandchild));

使用 SqlQuery,您应该确保 SQL SELECT 包含所有必要的列,必要时使用别名以匹配对象属性名称

【讨论】:

这会执行一次数据库访问吗? 我们遇到了 EF 查询非常低效/缓慢/导致多次访问数据库的问题,而我们可以使用常规 SQL 查询一次完成。 使用包含导致对数据库的单个请求。在 sql 上使用探查器或提取命令文本进行验证;)

以上是关于SQL 结果到具有子对象的复杂对象的主要内容,如果未能解决你的问题,请参考以下文章

如何将具有嵌套对象的复杂 json 文件映射到 java 对象?

如何在 Linq to SQL 中插入具有一对一关系的子对象

如何基于字段查询具有单个子对象的表中的对象的sql?

创建具有多个对象/层的视图 [关闭]

将具有子数组的对象数组映射和减少到具有父 ID 的子数组

将反序列化的 JSON 对象保存到具有重复子实体的数据库