【问题标题】:LINQ data services "Odata" select first child from parentLINQ 数据服务“Odata”从父项中选择第一个子项
【发布时间】:2014-04-20 23:19:22
【问题描述】:

我有一个 odata 服务,它返回一个带有子集合的父级。像 Order.OrderDetails 这样的东西。
在我尝试过的客户端上:

From x in context.Order.Expand("OrderDetails") Select x.OrderDetails[0]

“将 Linq 表达式转换为 URI 时出错:不支持方法 'Select'。”

From x in context.Order.Expand("OrderDetails") Select x.OrderDetails.FirstOrDefault()

“将 Linq 表达式转换为 URI 时出错:不支持方法 'Select'。”

From x in context.Order Select x.OrderDetails.FirstOrDefault()

“将 Linq 表达式转换为 URI 时出错:不支持方法 'Select'。”

【问题讨论】:

  • 您要检索的究竟是什么?
  • 类似 Order.Status、OrderDetail(0).Pieces 的东西。基本上我需要显示订单中的一些属性和订单上第一项的一些属性。或类似 Person.LastName、Person.Address(0).Street...
  • 我没有看到您在示例查询中选择订单的标准。
  • 没有标准。输出绑定到网格。我简化了示例 LINQ。假设我选择了所有“人员”及其第一个列出的地址以显示在网格中。

标签: c# linq wcf-data-services


【解决方案1】:

在我看来,除了 allany 的特殊情况外,OData 目前不支持对导航属性进行聚合(在您的情况下为 FirstOrDefault)。您要么需要检索所有 OrderDetails(即,只需在客户端上执行 Expand 并执行 FirstOrDefault),这可能会或可能不会接受,具体取决于数据量和您的性能要求,或者在服务器上创建特定的服务操作方法以准确检索您需要的数据。 OData 4 似乎支持聚合。2014 年 2 月 26 日有一个规范定义了 OData 中的聚合 - http://docs.oasis-open.org/odata/odata-data-aggregation-ext/v4.0/cs01/odata-data-aggregation-ext-v4.0-cs01.html#_Toc378326290 但我不知道当前工具是否支持它。

要使用 expand 实现第一种方法,您需要执行类似的操作

var result = (from order in context.Orders.Expand(o=>o.OrderDetails)
              where...
              orderby...
              select order).Skip(...).Take(...) //if you need paging
              .ToList();

var actualResult = from o in result
                   select new { Order = o, FirstDetail = o.FirstOrDefault() };

当然,根据您的需要,您可能无法通过这种方式获得第一个细节。关键是您在处理投影之前执行服务查询 (.ToList())。

【讨论】:

  • 从这篇文章msdn.microsoft.com/en-us/library/ee622463(v=vs.110).aspx 我意识到我必须用“扩展”拉取所有记录。我在示例中使用了扩展,但这似乎不起作用。一旦我用扩展拉记录,我不知道如何拉第一个孩子。
  • 我已经更新了我的答案。请记住,具有特定服务操作的方法更有效。
  • 虽然这不是我的想法,但它确实有效。感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-05-05
  • 1970-01-01
  • 2016-02-15
  • 2016-02-12
  • 1970-01-01
  • 1970-01-01
  • 2013-03-18
相关资源
最近更新 更多