【问题标题】:Netflix OData: Simple query using the 'Count' of a navigation propertyNetflix OData:使用导航属性的“计数”进行简单查询
【发布时间】:2011-10-23 09:21:06
【问题描述】:

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

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

但这给了我一个5DataServiceQueryException,内部例外是:

类型“System.Collections.Generic.ICollection”1[[Netflix.Catalog.v2.Entities.TitleAward, Netflix.Catalog.v2, Version=1.0.0.0, Culture=neutral, PublicKeyToken 中不存在属性“Count” =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)
在 System.Data.Services.Client.ALinqExpressionVisitor.VisitLambda(LambdaExpression lambda)
在 System.Data.Services.Client.ALinqExpressionVisitor.Visit(Expression exp)
在 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(ReadOnlyCollection1 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
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.DataServiceALinqExpressionVisitor.Visit(Expression exp)
在 System.Data.Services.Client.ResourceBinder.Bind(Expression e)
在 System.Data.Services.Client.DataServiceQueryProvider.Translate(Expression e)
在 System.Data.Services.Client.DataServiceQuery1.Execute()
at System.Data.Services.Client.DataServiceQuery
1.GetEnumerator()
在 System.Data.Services.Client.DataServiceQuery`1.System.Collections.IEnumerable.GetEnumerator()

我尝试遵循this question 的建议,但我得到的只是上述两个错误之一。

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

【问题讨论】:

    标签: c# .net wcf-data-services odata netflix


    【解决方案1】:

    您希望根据聚合操作(计数)做出决定(在本例中为“订单”)。
    OData 查询不支持这种聚合操作(目前?)。

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

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

    1. 将更多数据拉到客户端,并在那里过滤。
    2. 如果您控制服务器,则可以公开专门的服务 返回结果的操作(显然不是 Netflix 时的情况) 是您的数据源)

    【讨论】:

      猜你喜欢
      • 2018-08-18
      • 1970-01-01
      • 2021-02-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-25
      • 1970-01-01
      相关资源
      最近更新 更多