如何在Microsoft.Datasync.Client中用Include实现远程表预加载?
在Microsoft.Datasync库中实现关联数据查询(类似Include的效果)
Microsoft.Datasync客户端本身没有内置的Include方法,但可以借助OData的$expand机制实现相同的关联数据加载效果,具体步骤如下:
后端配置(关键前提)
确保实体关联关系正确定义:在继承自
EntityTableData的实体类中添加导航属性,同时在DbContext中配置对应的关联(比如HasOne/HasMany)。public class ChildEntity : EntityTableData { public string Name { get; set; } // 导航属性 public ParentEntity ParentTable { get; set; } public string ParentTableId { get; set; } } public class AppDbContext : DbContext { protected override void OnModelCreating(ModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); // 配置关联关系 modelBuilder.Entity<ChildEntity>() .HasOne(c => c.ParentTable) .WithMany() .HasForeignKey(c => c.ParentTableId); } }启用$expand查询支持:在Datasync的TableController中,允许客户端使用
$expand查询参数:public class ChildEntityController : TableController<ChildEntity> { public ChildEntityController(AppDbContext context) { Context = context; // 允许$expand选项 QueryOptions.AllowedQueryOptions |= Microsoft.AspNetCore.OData.Query.AllowedQueryOptions.Expand; } }
客户端实现
使用RemoteTable<T>提供的Expand方法,替代期望的Include方法,语法如下:
// 加载一级关联数据 var data = await _remotetable .Expand(x => x.ParentTable) .ToListAsync();
如果需要加载多层关联数据,支持两种写法:
// 链式调用加载多层 var data = await _remotetable .Expand(x => x.ParentTable) .Expand(x => x.ParentTable.SubTable) .ToListAsync(); // 或者用逗号分隔的字符串形式 var data = await _remotetable .Expand("ParentTable,ParentTable/SubTable") .ToListAsync();
注意事项
- 若后端未开启
$expand支持,客户端请求会返回400错误,必须确保控制器配置正确。 - 离线同步场景下,本地存储(如SQLite)需要正确配置导航属性的映射,才能在本地保存关联数据。
内容的提问来源于stack exchange,提问作者Sam
相关产品推荐
相关产品推荐

