【问题标题】:Orderby complex type using OData使用 OData 的 Orderby 复杂类型
【发布时间】:2012-10-05 20:34:39
【问题描述】:

我开始在我的 MVC4 应用程序中使用 OData,我遇到的问题是我无法对 IQueryable 执行任何排序或筛选操作,因为我使用的是复杂对象。下面是我想要完成的一个简单示例:

我的 API 控制器正在尝试将 MyObjects 集合作为 IQueryable 返回。

public IQueryable Get()
{
    List<MyObject> myObjects = GetMyObjects();
    return myObjects.AsQueryable() ;
}

每个 MyObject 都包含一个 InnerObject,它具有我想要对其进行排序和/或过滤的属性。

public class MyObject
{
    [Key]
    public MyInnerObject innerObject{ get; set; }

    public MyObject(Dictionary<string, object> value)
    {
        innerObject= new MyInnerObject(){
            item = value["item"].ToString(),
            itmdesc = value["itmdesc"].ToString()
        };
    }
}

public class MyInnerObject
{
    public string item { get; set; }
    public string itmdesc { get; set; }
}

我可以通过url成功执行top命令

localhost:5050/Test/Get?$top=10

但我真的希望能够使用

对我的结果进行排序
localhost:5050/Test/Get?$top=10&$orderby=innerObject.item

我试过了

localhost:5050/Test/Get?$top=10&$orderby=innerObject.item
localhost:5050/Test/Get?$top=10&$orderby=innerObject/item
localhost:5050/Test/Get?$top=10&$orderby=item

有什么建议吗?

编辑:

我应该提到,如果我将 item 和 itmdesc 属性放在 MyObject 中,它会起作用,但出于我的目的(这只是我的复杂实体的缩小版本),它们需要被包装在一个复杂类型中。

在我的 Api 控制器中,我也尝试过 IQueryable 但这并没有什么不同

【问题讨论】:

    标签: c# asp.net-mvc asp.net-web-api odata


    【解决方案1】:

    通常,OData 作为协议允许您尝试第二件事 (localhost:5050/Test/Get?$top=10&amp;$orderby=innerObject/item)。这很可能是 OData 的 Web API 实现的临时限制(假设这是您使用的基于环境的其余部分和 IQueryable 的返回)。

    【讨论】:

    • 是的,我就是不明白。当我在对象名称周围添加单引号时,$filter 起作用。用 orderby 也试过了……什么都没有。
    【解决方案2】:

    Aspnet Web API OData 不支持按嵌套属性或表达式排序。在 codeplex 上有一个 issue open 用于支持按嵌套属性排序。

    但是,如果您有点冒险精神,您可以使用 ODataQueryOptions 模型绑定各个 odata 查询选项,然后将 $orderby AST 转换为 linq 表达式并手动将其应用于您的 IQueryable。

    【讨论】:

    • 这还是一回事吗?链接页面暗示请求已关闭,应在客户端上按嵌套属性排序。对服务器端分页场景帮助不大...
    猜你喜欢
    • 1970-01-01
    • 2013-12-03
    • 2013-05-26
    • 1970-01-01
    • 1970-01-01
    • 2015-05-24
    • 2019-07-07
    • 2012-02-02
    • 1970-01-01
    相关资源
    最近更新 更多