首页 > 解决方案 > 子派生属性上的 OData v4 $orderby

问题描述

我有以下情况:

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 文档确定它 - 至少没有为包含的实体调用它。

标签: odataodata-v4

解决方案


这个答案在类似的情况下帮助了我很多:oData $expand on Derived Types

基本上,您可以使用您为模型定义的命名空间,而不是 .Net 完整类型名称,通过添加正斜杠和模型类型的限定名称,在查询中“转换”任何复杂或实体类型的属性。

[URL]/Stays?$expand=PrimaryGuest&$orderby=PrimaryGuest/ModelNamespace.PersonGuest/Surname

如果您不确定模型命名空间,请查看模型构建器代码,或使用类似以下内容:

        ODataConventionModelBuilder builder = new ODataConventionModelBuilder();
        builder.Namespace = "MyAppModel";

然后您的 URL 应如下所示:

[URL]/Stays?$expand=PrimaryGuest&$orderby=PrimaryGuest/MyAppModel.PersonGuest/Surname


推荐阅读