0

我通过使用 LINQPad 查询现有的 OData 提要来了解 OData。使用 Netflix 提要,我试图获得获奖最多的演员名单,但我遇到了奇怪的例外情况。我的第一次尝试是:

People.OrderByDescending(p => p.Awards.Count).Take(10)

但这给了我一个5DataServiceQueryException内在的例外:

'System.Collections.Generic.ICollection`1 类型中不存在属性 'Count' [[Netflix.Catalog.v2.Entities.TitleAward, Netflix.Catalog.v2, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null] ]' 在第 7 位。

我试图通过使用.Count()扩展方法而不是.Count属性来稍微改变一下:

People.OrderByDescending(p => p.Awards.Count()).Take(10)

但这只是给我一个 InvalidCastException:

无法将“System.Linq.Expressions.PropertyExpression”类型的对象转换为“System.Data.Services.Client.ResourceExpression”类型。

在 System.Data.Services.Client.ResourceBinder.AnalyzeCountMethod(MethodCallExpression mce)
在 System.Data.Services.Client.ResourceBinder.VisitMethodCall(MethodCallExpression mce)
在 System.Data.Services.Client.ALinqExpressionVisitor.Visit(Expression exp)
在 System .Data.Services.Client.DataServiceALinqExpressionVisitor.Visit(Expression exp)
at System.Data.Services.Client.ALinqExpressionVisitor.VisitLambda(LambdaExpression lambda)
at System.Data.Services.Client.ALinqExpressionVisitor.Visit(Expression exp)
at System.Data .Services.Client.DataServiceALinqExpressionVisitor.Visit(Expression exp)
在 System.Data.Services.Client.ALinqExpressionVisitor.VisitUnary(UnaryExpression u)
在 System.Data.Services.Client.ALinqExpressionVisitor.Visit(Expression exp)
在 System.Data.Services.Client.DataServiceALinqExpressionVisitor.Visit(Expression exp)
在 System.Data.Services.Client.ALinqExpressionVisitor.VisitExpressionList(ReadOnlyCollection 1 original) 在System.Data.Services.Client.ALinqExpressionVisitor.VisitMethodCall(MethodCallExpression m) 在 System.Data.Services.Client.ResourceBinder.VisitMethodCall(MethodCallExpression mce) 在 System.Data.Services.Client.ALinqExpressionVisitor.Visit(Expression exp) 在系统。 System.Data.Services.Client.ResourceBinder.Bind(Expression e) 处的Data.Services.Client.DataServiceALinqExpressionVisitor.Visit(Expression exp )1 original)
at System.Data.Services.Client.ALinqExpressionVisitor.VisitMethodCall(MethodCallExpression m)
at System.Data.Services.Client.ResourceBinder.VisitMethodCall(MethodCallExpression mce)
at System.Data.Services.Client.ALinqExpressionVisitor.Visit(Expression exp)
at System.Data.Services.Client.DataServiceALinqExpressionVisitor.Visit(Expression exp)
at System.Data.Services.Client.ALinqExpressionVisitor.VisitExpressionList(ReadOnlyCollection






在 System.Data.Services.Client.DataServiceQueryProvider.Translate(Expression e)
在 System.Data.Services.Client.DataServiceQuery 1.GetEnumerator() 在 System.Data.Services.Client.DataServiceQuery`1.System.Collections.IEnumerable。获取枚举器() 1.Execute()
at System.Data.Services.Client.DataServiceQuery

我试图遵循这个问题的建议,但我得到的只是上述两个错误之一。

任何想法如何执行这个简单的操作?

4

1 回答 1

2

您想要基于聚合操作(计数)做出决定(在本例中为“订单”)。
OData 查询不支持这种聚合操作(现在?)。

有关更多信息,请参阅此问题: Collection Exists Criteria in WCF Data Services

最后,您将不得不以不同的方式处理过滤/排序数据。至少 2 种可能的解决方案:

  1. 将更多数据拉到客户端,并在那里过滤。
  2. 如果您控制服务器,那么您可以公开一个专门的服务操作来返回结果(当 Netflix 是您的数据源时显然不是这种情况)
于 2011-10-23T10:11:51.583 回答