我有以下课程:
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?)
答案 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。翻译是通过服务实现的。
我同意相关问题的答案:“使用具有很多基数的导航属性不可能做到这一点”。由于它的基数很多,服务无法知道哪一个应该用于排序。