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=null] にプロパティ 'Count' が存在しません]' 位置 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(式の式)
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 オリジナル) で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. System.Data.Services.Client.ResourceBinder.Bind(式 e) のData.Services.Client.DataServiceALinqExpressionVisitor.Visit(式 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. GetEnumerator() 1.Execute()
at System.Data.Services.Client.DataServiceQuery

この質問の提案に従おうとしましたが、上記の2つのエラーのうちの1つしか得られませんでした。

この簡単な操作を実行する方法はありますか?

4

1 に答える 1

2

集計操作 (カウント) に基づいて決定 (この場合は「順序」) を行いたいと考えています。
この種の集計操作は、OData クエリではサポートされていません (現時点では?)。

詳細については、この質問を参照してください: Collection Exists Criteria in WCF Data Services

最終的には、別の方法でデータのフィルタリング/順序付けを処理する必要があります。少なくとも 2 つの可能な解決策:

  1. より多くのデータをクライアントにプルし、そこでフィルタリングします。
  2. サーバーを制御する場合は、特殊なサービス操作を公開して結果を返すことができます (Netflix がデータ ソースである場合は明らかにそうではありません)。
于 2011-10-23T10:11:51.583 に答える