集合属性上的OData $ orderby子句

时间:2014-02-06 01:12:34

标签: asp.net-web-api odata

我有以下课程:

 public class Parent
 {
     public string ParentProp { get; set; }
     public IEnumerable<Child> ManyChildren { get; set; }
 }

 public class Child
 {
     public string ChildName { get; set; }
     public int Value { get; set; }
 }

假设我定义了一个返回IEnumberable<Parent>的OData操作。我可以写一个执行以下操作的$orderby子句('parent'是IEnumerable<Parent>):

parents.OrderBy(x => x.ManyChildren.Single(y => y.ChildName == "Child1").Value);

我知道我可以编写自定义操作(http://msdn.microsoft.com/en-us/library/hh859851(v=vs.103).aspx)来为我做这个排序,但我宁愿使用$orderby子句。 (唯一提出类似问题的SO问题有点过时 - How can I order objects according to some attribute of the child in OData?

2 个答案:

答案 0 :(得分:1)

正如我所尝试的那样,可以在$ expand中嵌套$ orderby,因此将会:

odata/User?&$select=Active,Description,Name,UserId&$expand=Company($select=Active,Name,CreatedBy,CompanyId;$orderby=Active asc)

你得到的就是:

ORDER BY [Project2].[UserId] ASC, [Project2].[C19] ASC

将分别为每个用户订购公司集合。

我认为在版本OD7 Client for .NET 6.7.0中支持,在发行说明中是扭曲的:

在查询选项中             $ id,$ select,$ expand(包括嵌套查询选项)....

我在6.1版中看到嵌套选项的值存在并位于:

DataQueryOptions-&GT; SelectExpand-&GT; SelectExpandClasue-&GT; SelectedItems-&GT; ExpandNavigationItem-&GT; OrderByOption

但无效。

我尝试使用System.Web.OData 5.6和所有相关的依赖项,但接缝不起作用。

我的结论:

像DataQueryOptions一样准备好的接缝存在嵌套的orderby但不起作用。

就像我发现标准接缝正朝这个方向发展。 https://issues.oasis-open.org/browse/ODATA-32

答案 1 :(得分:0)

这取决于您的OData服务实现。您使用的是哪种服务? WCFDS,WebAPI或您自己实施的服务?

Url解析器可以解析诸如root / People?$ orderby = Company / Name之类的URL。翻译是通过服务实现的。

我同意相关问题的答案:“使用具有很多基数的导航属性不可能做到这一点”。由于它的基数很多,服务无法知道哪一个应该用于排序。