我有几个从共同祖先继承的实体。
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
在单个调用中检索所有实体,而无需多次复制相同的调用以进行DescendantA
、DescendantB
等。
控制器,脚手架,如下所示:
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 祖先控制器 : 表控制器
根据您定义的 TableControllerAncestorController
和GetAllAncestor
方法返回的结果,我假设您在MobileServiceContext
DbContext 下定义了以下 DbSet:
public DbSet<Ancestor> Ancestors { get; set; }
根据您的代码,您定义了一个名为Ancestors
的 SQL 数据库表,它仅包含来自您定义的EntityData
和AncestorType
列的系统列。
我创建了一个控制器 AncestorController 来检索单个调用中的所有实体,而无需多次复制相同的调用来获取后代 A、后代 B 等。
根据我的理解,DescendantA 和 DescendantB表示为每个数据库表,您需要独立定义 TableController 并针对每个表端点发送请求以检索记录。
public class DescendantAController : TableController<DescendantA>
{
//TODO:
}
public class DescendantBController : TableController<DescendantB>
{
//TODO:
}
此外,您还可以创建新操作或覆盖 TableController 提供的现有内置操作,并将所有后代表记录合并到一个操作中,但可能无法利用某些功能(例如脱机同步、OData 查询等)。