【问题标题】:SQL result to complex object with childrenSQL 结果到具有子对象的复杂对象
【发布时间】: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 查询

标签: c# sql asp.net-mvc


【解决方案1】:

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

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

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

【讨论】:

  • 这会执行一次数据库访问吗?
  • 我们遇到了 EF 查询非常低效/缓慢/导致多次访问数据库的问题,而我们可以使用常规 SQL 查询一次完成。
  • 使用包含导致对数据库的单个请求。在 sql 上使用探查器或提取命令文本进行验证;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-11-28
  • 2018-10-06
  • 2013-03-15
  • 1970-01-01
  • 1970-01-01
  • 2011-12-08
  • 1970-01-01
相关资源
最近更新 更多