You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Azure远程表与Entity Framework:如何实现两表关联查询?

解决方案

方案1:后端自定义API处理关联查询

Azure Mobile Apps的RemoteTable默认是单表操作模式,要实现关联查询,最直接的方式是在后端新增自定义API接口,直接通过EF DbContext完成关联逻辑:

  1. 在后端项目中新建ApiController,比如UserWithRelatedController
  2. 注入你的DbContext实例,编写包含关联查询的方法:
[Route("api/[controller]")]
public class UserWithRelatedController : Controller
{
    private readonly AppDbContext _dbContext;

    public UserWithRelatedController(AppDbContext dbContext)
    {
        _dbContext = dbContext;
    }

    [HttpGet("byemail/{email}")]
    public async Task<IActionResult> GetUserWithRelated(string email)
    {
        var userData = await _dbContext.UserItems
            .Include(u => u.TargetRelatedTable) // 替换为你的关联表导航属性
            .Where(u => u.Email == email)
            .ToListAsync();
        
        if (!userData.Any())
            return NotFound();
        
        return Ok(userData);
    }
}
  1. 客户端直接调用该自定义API端点,而非通过RemoteTable,即可一次性获取关联数据。

方案2:利用Azure Mobile Apps的$expand查询选项

如果想继续基于RemoteTable实现,需先在后端配置实体导航属性并开启$expand支持:

  1. 在实体类中添加关联导航属性:
public class UserItem
{
    public string Id { get; set; }
    public string Email { get; set; }
    // 关联另一张表的导航属性
    public ICollection<RelatedTableItem> RelatedItems { get; set; }
}
  1. 在DbContext中配置实体关系:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<UserItem>()
        .HasMany(u => u.RelatedItems)
        .WithOne(r => r.User)
        .HasForeignKey(r => r.UserId);
}
  1. 在后端的RemoteTable控制器中开启$expand支持:
public class UserItemController : TableController<UserItem>
{
    protected override void Initialize(HttpControllerContext controllerContext)
    {
        base.Initialize(controllerContext);
        var context = new AppDbContext();
        DomainManager = new EntityDomainManager<UserItem>(context, Request, enableSoftDelete: true);
        // 允许查询时使用$expand
        Queryable = context.UserItems.AsQueryable();
    }

    // 确保Get方法支持关联加载
    public IQueryable<UserItem> GetAllUserItem()
    {
        return Queryable.Include(u => u.RelatedItems);
    }
}
  1. 客户端查询时通过Expand方法加载关联数据:
public async Task<IEnumerable<UserItem>?> GetItemByEmailWithRelated(string email)
{
    await InitializeAsync();
    try
    {
        return await _table.GetAsyncItems()
            .Where(x => x.Email == email)
            .Expand(x => x.RelatedItems) // 指定要加载的关联表数据
            .ToListAsync();
    }
    catch (Exception e)
    {
        return null;
    }
}

关于RemoteTable中实现关联的建议

RemoteTable的设计定位是轻量单表CRUD,复杂的多表关联、多条件筛选逻辑更适合放在自定义API中处理,这样代码逻辑更清晰,后期维护成本更低。如果是简单的一对一/一对多关联,使用$expand是可行的,但复杂场景下优先选自定义API方案。

内容的提问来源于stack exchange,提问作者inno

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 01:10:32