Netflix OData:使用“Count”的简单查询导航属性的

发布于 2024-12-11 07:52:12 字数 3105 浏览 0 评论 0原文

我通过使用 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(表达式 exp)
在 System.Data.Services.Client.DataServiceALinqExpressionVisitor.Visit(表达式 exp)
在 System.Data.Services.Client.ALinqExpressionVisitor.VisitLambda(LambdaExpression lambda)
在 System.Data.Services.Client.ALinqExpressionVisitor.Visit(表达式 exp)
在 System.Data.Services.Client.DataServiceALinqExpressionVisitor.Visit(表达式 exp)
在 System.Data.Services.Client.ALinqExpressionVisitor.VisitUnary(UnaryExpression u)
在 System.Data.Services.Client.ALinqExpressionVisitor.Visit(表达式 exp)
在 System.Data.Services.Client.DataServiceALinqExpressionVisitor.Visit(表达式 exp)
在 System.Data.Services.Client.ALinqExpressionVisitor.VisitExpressionList(ReadOnlyCollection1 原始)
在 System.Data.Services.Client.ALinqExpressionVisitor.VisitMethodCall(MethodCallExpression m)
在 System.Data.Services.Client.ResourceBinder.VisitMethodCall(MethodCallExpression mce)
在 System.Data.Services.Client.ALinqExpressionVisitor.Visit(表达式 exp)
在 System.Data.Services.Client.DataServiceALinqExpressionVisitor.Visit(表达式 exp)
在 System.Data.Services.Client.ALinqExpressionVisitor.VisitExpressionList(ReadOnlyCollection
1 原始)
在 System.Data.Services.Client.ALinqExpressionVisitor.VisitMethodCall(MethodCallExpression m)
在 System.Data.Services.Client.ResourceBinder.VisitMethodCall(MethodCallExpression mce)
在 System.Data.Services.Client.ALinqExpressionVisitor.Visit(表达式 exp)
在 System.Data.Services.Client.DataServiceALinqExpressionVisitor.Visit(表达式 exp)
在 System.Data.Services.Client.ResourceBinder.Bind(表达式 e)
在 System.Data.Services.Client.DataServiceQueryProvider.Translate(表达式 e)
在 System.Data.Services.Client.DataServiceQuery1.Execute()
在 System.Data.Services.Client.DataServiceQuery
1.GetEnumerator()
在 System.Data.Services.Client.DataServiceQuery`1.System.Collections.IEnumerable.GetEnumerator()

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

有什么想法如何执行这个简单的操作吗?

I am getting to know OData by querying existing OData feeds using LINQPad. Using the Netflix feed, I am attempting to get a list of actors with the most awards, but I am getting strange exceptions. My first attempt was:

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

But that gave me a 5DataServiceQueryException with an inner exception of:

No property 'Count' exists in type 'System.Collections.Generic.ICollection`1[[Netflix.Catalog.v2.Entities.TitleAward, Netflix.Catalog.v2, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]' at position 7.

I tried to change things a little, by using the .Count() extension method instead of the .Count property:

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

But that just game me an InvalidCastException:

Unable to cast object of type 'System.Linq.Expressions.PropertyExpression' to type 'System.Data.Services.Client.ResourceExpression'.

at System.Data.Services.Client.ResourceBinder.AnalyzeCountMethod(MethodCallExpression mce)
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.VisitLambda(LambdaExpression lambda)
at System.Data.Services.Client.ALinqExpressionVisitor.Visit(Expression exp)
at System.Data.Services.Client.DataServiceALinqExpressionVisitor.Visit(Expression exp)
at System.Data.Services.Client.ALinqExpressionVisitor.VisitUnary(UnaryExpression u)
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(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)
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.ResourceBinder.Bind(Expression e)
at System.Data.Services.Client.DataServiceQueryProvider.Translate(Expression e)
at System.Data.Services.Client.DataServiceQuery1.Execute()
at System.Data.Services.Client.DataServiceQuery
1.GetEnumerator()
at System.Data.Services.Client.DataServiceQuery`1.System.Collections.IEnumerable.GetEnumerator()

I tried to follow the suggestions at this question but all I got is one of the above two errors.

Any ideas how to perform this simple operation?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

川水往事 2024-12-18 07:52:12

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

请参阅此问题以获取更多信息:
WCF 数据服务中存在集合条件

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

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

You are wanting to make a decision (in this case "order"), based on an aggregate operation (count).
That kind of aggregate operation is not supported in OData queries (for now?).

See this this question for more information:
Collection Exists Criteria in WCF Data Services

In the end, you would have to deal with filtering/ordering the data in a different way.
At least 2 possible solutions:

  1. Pull more data down to the client, and filter it there.
  2. If you control the server, then you can expose a specialized service
    operation to return the result (obviously not the case when Netflix
    is your data source)
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文