2

我开始在我的 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< MyObject> 但这并没有什么不同

4

2 回答 2

4

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

于 2012-10-15T23:29:59.980 回答
1

Aspnet Web API OData 不支持按嵌套属性或表达式排序。在 codeplex 上存在一个支持按嵌套属性排序的问题。

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

于 2013-01-25T18:29:06.237 回答