LINQ数据服务" Odata"选择父母的第一个孩子

时间:2014-04-20 23:19:22

标签: c# linq wcf-data-services

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

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

"将Linq表达式转换为URI时出错:方法'选择'不受支持。"

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

"将Linq表达式转换为URI时出错:方法'选择'不受支持。"

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

"将Linq表达式转换为URI时出错:方法'选择'不受支持。"

1 个答案:

答案 0 :(得分:0)

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

要实现扩展的第一种方法,您需要执行类似的操作

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())。