我有以下场景:
public class Stay
{
[Contained]
public Guest PrimaryGuest {get;set;}
}
public abstract class Guest
{
public int ID {get; set;}
}
public class EntityGuest : Guest
{
public string EntityName {get;set;}
}
public class PersonGuest : Guest
{
public string SurName {get;set;}
public string GivenName {get;set;}
}
在查询停留时,我希望通过PersonGuest / SurName进行排序。
我知道如何通过儿童财产订购:[URL]/Stays?$expand=PrimaryGuest&$orderby=PrimaryGuest/ID
- 但我如何订购派生的儿童财产?它甚至可能吗?我无法通过OData文档确定它 - 它至少不会被包含的实体所取代。
这个答案在类似的场景中给了我很多帮助:oData $expand on Derived Types
基本上,您可以使用为模型定义的命名空间(而不是.Net完整类型名称),通过添加正斜杠和模型类型的限定名称,在查询中“强制转换”任何复杂或实体类型的属性。
[URL]/Stays?$expand=PrimaryGuest&$orderby=PrimaryGuest/ModelNamespace.PersonGuest/Surname
如果您不确定模型名称空间,请查看模型构建器代码,或使用类似于此的内容:
ODataConventionModelBuilder builder = new ODataConventionModelBuilder();
builder.Namespace = "MyAppModel";
然后您的网址应如下所示:
[URL]/Stays?$expand=PrimaryGuest&$orderby=PrimaryGuest/MyAppModel.PersonGuest/Surname