使用OData命令复杂类型

时间:2012-10-15 19:47:54

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

我开始在我的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

有什么建议吗?

修改

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

在我的Api控制器中,我也尝试过IQueryable&lt;为MyObject&GT;但这并没有什么区别

2 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:1)

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

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