axios .NET Core Api中的嵌套实体和性能与实体框架核心

bxgwgixi  于 2022-11-05  发布在  iOS
关注(0)|答案(1)|浏览(162)

我想在.NET核心+实体框架核心上构建我的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核心
有没有人知道或者可以指向一些文档的链接来管理Entity Framework Core + .NET Core API中的客户端可选包含?

ddarikpa

ddarikpa1#

如果使用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中查询include,而不是在客户端进行查询,如下所示:

[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());
}

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

相关问题