Netflix OData: простой запрос с использованием 'Count' свойства навигации - PullRequest
0 голосов
/ 23 октября 2011

Я узнаю OData, запрашивая существующие каналы OData с помощью LINQPad.Используя ленту Netflix, я пытаюсь получить список актеров с наибольшим количеством наград, но я получаю странные исключения.Моя первая попытка была:

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

Но это дало мне 5DataServiceQueryException с внутренним исключением:

Нет свойства 'Count' в типе System.Collections.Generic.ICollection`1 [[Netflix.Catalog.v2.Entities.TitleAward, Netflix.Catalog.v2, версия = 1.0.0.0, культура = нейтральная, PublicKeyToken = ноль]] 'в положении 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)
в System.Data.S.Client.DataServiceALinqExpressionVisitor.Visit (Expression exp)
в System.Data.Services.Client.ALinqExpressionVisitor.VisitLambda (LambdaExpression lambda)
в System.Data.Services.Client.ALinqExpressionVisitor.Visit * Expression в
.Data.Services.Client.DataServiceALinqExpressionVisitor.Visit (Expression exp)
в System.Data.Services.Client.ALinqExpressionVisitor.VisitUnary (UnaryExpression u)
в System.Data.Services.Client.itisitorExp.exp)
в System.Data.Services.Client.DataServiceALinqExpressionVisitor.Visit (Expression exp)
в System.Data.Services.Client.ALinqExpressionVisitor.VisitExpressionList (ReadOnlyCollection 1 original)<br> at System.Data.Services.Client.ALinqExpressionVisitor.VisitMethodCall(MethodCallExpression m)<br> at System.Data.Services.Client.ResourceBinder.VisitMethodCall(MethodCallExpression mce)<br> at System.Data.Services.Client.ALinqExpressionVisitor.Visit(Expression exp)<br> at System.Data.Services.Client.DataServiceALinqExpressionVisitor.Visit(Expression exp)<br> at System.Data.Services.Client.ALinqExpressionVisitor.VisitExpressionList(ReadOnlyCollection 1 оригинал)
в.Data.Services.Client.ALinqExpressionVisitor.VisitMethodCall (MethodCallExpression m)
в System.Data.Services.Client.ResourceBinder.VisitMethodCall (MethodCallExpression mce)
в выражении System.Data.Services.Client.)
в System.Data.Services.Client.DataServiceALinqExpressionVisitor.Visit (Expression exp)
в System.Data.Services.Client.ResourceBinder.Bind (Expression e)
в System.Data.Services.Client.DataServiceQueryProvider.Translate (Выражение e)
в System.Data.Services.Client.DataServiceQuery 1.Execute()<br> at System.Data.Services.Client.DataServiceQuery 1.GetEnumerator ()
в System.Data.Services.Client.DataServiceQuery`1.System.Collections.IEnumerable.GetEnumerator ()

Я пытался следовать предложениям на этом вопросе , но все, что я получил, - это одна из двух вышеуказанных ошибок.

Есть идеи, как выполнить эту простую операцию?

1 Ответ

2 голосов
/ 23 октября 2011

Вы хотите принять решение (в данном случае «заказ») на основе агрегированной операции (подсчета).Этот тип операции агрегирования не поддерживается в запросах OData (на данный момент?).

См. Этот вопрос для получения дополнительной информации: Критерии сбора существует в службах данных WCF

В конце концов, вам придется иметь дело с фильтрацией / упорядочением данных по-другому.Как минимум 2 возможных решения:

  1. Получите больше данных на клиент и отфильтруйте их там.
  2. Если вы управляете сервером, вы можете предоставить специализированную сервисную операцию для возврата результата (очевидно, не тот случай, когда Netflix является вашим источником данных)
...