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 对象?