【问题标题】:Nested entities and performance in .NET Core Api with Entity Framework Core.NET Core Api 中的嵌套实体和性能与 Entity Framework Core
【发布时间】:2022-11-02 20:04:45
【问题描述】:

我想通过 .NET Core + Entity Framework Core 构建我的 API。

我非常熟悉 Sequelize ORM (javascript),您可以完全控制自定义查询。

即想象一个数据模型,其中你有学校,每所学校都有很多学生。

有时我只想查询学校(更快),有时我想查询有学生的学校(更慢)。

因此,我在 Sequelize 服务器上使用 axios 客户端:

// including students (slower)
this.$axios.$get('/api/school',{ params : { where: { Country: 'US' }, include: [{ model: 'Student' }] } })

// not including students (faster)
this.$axios.$get('/api/school',{ params : { where: { Country: 'US' } })

但是我找不到用 axios 和 .NET Core 做类似事情的方法

有谁知道或可以指向一些文档的链接来管理 Entity Framework Core + .NET Core API 中的客户端可选包含?

【问题讨论】:

  • 您没有发布任何与 EF 相关的代码。我们无法猜测查询可能有什么问题,您如何加载实体。

标签: c# asp.net-core axios entity-framework-core asp.net-core-webapi


【解决方案1】:

如果您使用 EF 查询实体,您可以定义要在查询中包含哪些子对象,如下所示:

context.DbSet<School>().Include(s => s.Students).ToList();

为了在您的端点中进行这项工作,它变成了这样:

public IActionResult Get(string country, string[] includes)
{
    var query = _context.DbSet<School>();

    foreach (var include in includes)
    {
        query = query.Include(include);
    }

    return query.ToList();
}

尽管实际上并不建议允许客户端定义要包含的内容。如果有与学校相关联的财务数据,并且客户也包括在内怎么办?!你当然想要那个!

我建议创建一个单独的端点,并在 API 中查询包含,而不是在客户端执行,如下所示:

[HttpGet("school")]
public IActionResult Get(string country)
{
    return Ok(_context.DbSet<School>().ToList());
}

[HttpGet("schoolWithStudents")]
public IActionResult Get(string country)
{
    return Ok(_context.DbSet<School>().Include(s => s.Students).ToList());
}

为简洁起见,忽略对国家/地区的过滤。

【讨论】:

  • 感谢您的@rotgers,我了解与此相关的安全问题。但是你想对“创建一个单独的端点”说什么?你能举个例子吗?
  • 我已经用一个例子更新了我的答案。
猜你喜欢
  • 2020-11-16
  • 1970-01-01
  • 1970-01-01
  • 2020-03-23
  • 2021-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-02
相关资源
最近更新 更多