Azure 移动服务 C#:如何 return 完全继承实体而不仅仅是祖先的字段
Azure Mobile Services C#: how to return full inherited entity and not only the fields of the ancestor
我几乎没有继承自共同祖先的实体。
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()
returns 只有具有 Ancestor
字段的元素,而不是 DescendantA
and/or 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"
}
]
我应该怎么做才能达到这样的目标?
谢谢!!!
cghersi
public class AncestorController : TableController
根据你定义的TableControllerAncestorController
和GetAllAncestor
方法返回的结果,我假设你在MobileServiceContext
DbContext下定义了如下DbSet:
public DbSet<Ancestor> Ancestors { get; set; }
根据您的代码,您定义了一个名为 Ancestors
的 SQL 数据库 table,它只包含来自 EntityData
和 AncestorType
您定义的列。
I created a controller AncestorController to retrieve all the entities in a single call, without the need to replicate the same call several time for DescendantA, DescendantB, etc.
据我了解,DescendantA 和 DescendantB 代表每个数据库 table,您需要独立定义您的 TableController 并且针对每个 table 端点发送请求以检索记录。
public class DescendantAController : TableController<DescendantA>
{
//TODO:
}
public class DescendantBController : TableController<DescendantB>
{
//TODO:
}
此外,您还可以创建一个新操作或覆盖 TableController 提供的现有内置操作,并将所有后代 table 记录合并到一个操作中,但您可能无法利用某些功能 (例如离线同步、OData 查询等)。
您可以使用来自 SQL 的视图,它会为您提供此结果
创建视图组合
作为
开始
Select * 来自 DescendantB UNION Select * 来自 DescendantA
结束
然后在 Table 控制器中使用 View 而不是 table
public class CombineController : TableController<Combine>
{
...
public IQueryable<Combine> GetAllAncestor()
{
return Query();
}
...
}
我几乎没有继承自共同祖先的实体。
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()
returns 只有具有 Ancestor
字段的元素,而不是 DescendantA
and/or 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"
}
]
我应该怎么做才能达到这样的目标?
谢谢!!!
cghersi
public class AncestorController : TableController
根据你定义的TableControllerAncestorController
和GetAllAncestor
方法返回的结果,我假设你在MobileServiceContext
DbContext下定义了如下DbSet:
public DbSet<Ancestor> Ancestors { get; set; }
根据您的代码,您定义了一个名为 Ancestors
的 SQL 数据库 table,它只包含来自 EntityData
和 AncestorType
您定义的列。
I created a controller AncestorController to retrieve all the entities in a single call, without the need to replicate the same call several time for DescendantA, DescendantB, etc.
据我了解,DescendantA 和 DescendantB 代表每个数据库 table,您需要独立定义您的 TableController 并且针对每个 table 端点发送请求以检索记录。
public class DescendantAController : TableController<DescendantA>
{
//TODO:
}
public class DescendantBController : TableController<DescendantB>
{
//TODO:
}
此外,您还可以创建一个新操作或覆盖 TableController 提供的现有内置操作,并将所有后代 table 记录合并到一个操作中,但您可能无法利用某些功能 (例如离线同步、OData 查询等)。
您可以使用来自 SQL 的视图,它会为您提供此结果
创建视图组合 作为 开始 Select * 来自 DescendantB UNION Select * 来自 DescendantA 结束
然后在 Table 控制器中使用 View 而不是 table
public class CombineController : TableController<Combine>
{
...
public IQueryable<Combine> GetAllAncestor()
{
return Query();
}
...
}