Azure 移动服务 C#:如何返回完全继承的实体,而不仅仅是祖先的字段



我有几个从共同祖先继承的实体。

public class Ancestor : EntityData {
public string AncestorType { get; set; } //kind of enum
}
public class DescendantA : Ancestor {
public string DescendantAProp { get; set; }
}
public class DescendantB : Ancestor {
public int DescendantBProp { get; set; }
}

我创建了一个控制器AncestorController在单个调用中检索所有实体,而无需多次复制相同的调用以进行DescendantADescendantB等。

控制器,脚手架,如下所示:

public class AncestorController : TableController<Ancestor>
{
...
public IQueryable<Ancestor> GetAllAncestor()
{
return Query(); 
}
...
}

不幸的是,该方法GetAllAncestor()只返回具有Ancestor字段的元素,而不是DescendantA和/或DescendantB字段。

例如,返回的 JSON 示例:

[
{
"deleted": false,
"updatedAt": "2018-01-23T00:05:52.3Z",
"createdAt": "2018-01-23T00:05:52.3Z",
"version": "AAAAAAAAB9Q=",
"id": "07434aaa-c51a-425a-aca4-90bfb9a06a54",
"ancestorType": "DescendantA"
},
{
"deleted": false,
"updatedAt": "2018-01-24T23:00:20.907Z",
"createdAt": "2018-01-24T23:00:20.692Z",
"version": "AAAAAAAAJ2U=",
"id": "08f89ee7-ca78-46ea-9b6a-ef23bda3299b",
"ancestorType": "DescendantB"
}
]

虽然我希望看到:

[
{
"deleted": false,
"updatedAt": "2018-01-23T00:05:52.3Z",
"createdAt": "2018-01-23T00:05:52.3Z",
"version": "AAAAAAAAB9Q=",
"id": "07434aaa-c51a-425a-aca4-90bfb9a06a54",
"ancestorType": "DescendantA",
"DescendantAProp": "SomeValueA"
},
{
"deleted": false,
"updatedAt": "2018-01-24T23:00:20.907Z",
"createdAt": "2018-01-24T23:00:20.692Z",
"version": "AAAAAAAAJ2U=",
"id": "08f89ee7-ca78-46ea-9b6a-ef23bda3299b",
"ancestorType": "DescendantB",
"DescendantBProp": "SomeValueB"
}
]

我应该怎么做才能实现这样的目标?

谢谢!!!

切尔西

您可以使用来自SQL的视图,它为您提供此结果

创建视图组合 如 开始 从后代中选择 * 联合 从后代 A 中选择 * 结束

然后在表控制器中使用视图而不是表

public class CombineController : TableController<Combine>
{
...
public IQueryable<Combine> GetAllAncestor()
{
return Query(); 
}
... 
}

public class 祖先控制器 : 表控制器

根据您定义的 TableControllerAncestorControllerGetAllAncestor方法返回的结果,我假设您在MobileServiceContextDbContext 下定义了以下 DbSet:

public DbSet<Ancestor> Ancestors { get; set; }

根据您的代码,您定义了一个名为Ancestors的 SQL 数据库表,它仅包含来自您定义的EntityDataAncestorType列的系统列。

我创建了一个控制器 AncestorController 来检索单个调用中的所有实体,而无需多次复制相同的调用来获取后代 A、后代 B 等。

根据我的理解,DescendantA 和 DescendantB表示为每个数据库表,您需要独立定义 TableController 并针对每个表端点发送请求以检索记录。

public class DescendantAController : TableController<DescendantA>
{
//TODO:
}
public class DescendantBController : TableController<DescendantB>
{
//TODO:
}

此外,您还可以创建新操作或覆盖 TableController 提供的现有内置操作,并将所有后代表记录合并到一个操作中,但可能无法利用某些功能(例如脱机同步、OData 查询等)。

最新更新