【问题标题】:OData $orderby clause on collection property集合属性上的 OData $orderby 子句
【发布时间】:2014-02-06 01:12:33
【问题描述】:

我有以下课程:

 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&lt;Parent&gt; 的 OData 操作。我可以编写一个执行以下操作的$orderby 子句吗(“父母”是IEnumerable&lt;Parent&gt;):

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?

【问题讨论】:

    标签: asp.net-web-api odata


    【解决方案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
    

    将为每个用户单独订购公司系列。

    我认为 .NET 6.7.0 的 OData Client 版本是受支持的,在发行说明中是这样:

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

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

    DataQueryOptions->SelectExpand->SelectExpandClasue->SelectedItems->ExpandNavigationItem->OrderByOption

    但不工作。

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

    我的结论:

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

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

    【讨论】:

      【解决方案2】:

      这取决于您的 OData 服务实施。您正在使用哪种服务? WCFDS、WebAPI 还是您自己实现的服务?

      Url parser 可以解析root/People?$orderby=Company/Name 等URL。翻译器由服务实现。

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

      【讨论】:

        猜你喜欢
        • 2018-04-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-12-03
        • 1970-01-01
        • 2023-03-23
        相关资源
        最近更新 更多