Netflix OData:使用“Count”的简单查询导航属性的
我通过使用 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 原始)
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.ALinqExpressionVisitor.VisitExpressionList(ReadOnlyCollection
在 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()
1.GetEnumerator()
在 System.Data.Services.Client.DataServiceQuery
在 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)
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
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()
1.GetEnumerator()
at System.Data.Services.Client.DataServiceQuery
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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
您想要根据聚合操作(计数)做出决定(在本例中为“顺序”)。
OData 查询不支持这种聚合操作(目前?)。
请参阅此问题以获取更多信息:
WCF 数据服务中存在集合条件
最后,您将获得以不同的方式处理数据过滤/排序。
至少有 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:
operation to return the result (obviously not the case when Netflix
is your data source)