我有一个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时出错:方法'选择'不受支持。"
答案 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())。