我开始在我的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;但这并没有什么区别
答案 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。