Netflix OData с LINQ: «Метод« Выбор »не поддерживается». - PullRequest
3 голосов
/ 06 августа 2011

Я следую (плохому?) Примеру запроса каталога Netflix, используя следующий код:

NetflixCatalog cat = new NetflixCatalog(CatalogUri);
IQueryable<Title> query = from person in cat.People
                          from t in person.TitlesActedIn
                          where person.Name == searchString
                          orderby t.ReleaseYear
                          select new Title
                          {
                              Name = t.Name,
                              BoxArt = t.BoxArt,
                              Synopsis = t.Synopsis,
                              ReleaseYear = t.ReleaseYear,
                              Runtime = t.Runtime,
                              Type = t.Type,
                              Genres = t.Genres,
                              Cast = t.Cast
                          };

foreach (var title in query)
{
   ...
}

Он взрывается на строке foreach с вышеупомянутой ошибкой.

1 Ответ

4 голосов
/ 07 августа 2011

Я думаю, что могу дать вам запрос, который работает, но я не могу объяснить, почему ваш запрос не работает (если вы не достаточно довольны «Становится его OData, и они не поддерживают каждую команду Linq»)

Попробуйте изменить запрос на что-то вроде

NetflixCatalog cat = new NetflixCatalog(CatalogUri);
string searchString = "Michael Caine";
var person = (from r in cat.People where r.Name == searchString select r).Single();

var query  = (from p in cat.People 
              where p.Id == person.Id   
              from t in p.TitlesActedIn
              orderby t.ReleaseYear
              select new Title
                      {
                          Name = t.Name,
                          BoxArt = t.BoxArt,
                          Synopsis = t.Synopsis,
                          ReleaseYear = t.ReleaseYear,
                          Runtime = t.Runtime,
                          Type = t.Type,
                          Genres = t.Genres,
                          Cast = t.Cast
                      };

Обратите внимание, что это фактически два запроса, но я не думаю, что вы можете объединить их в один запрос.Например, вы не можете просто изменить

  where p.Id == persion.Id 

на p.Name == searchString

Теперь я точно не знаю почему, ожидайте, что я узнал, что OData не являетсячто-нибудь вроде LinqToSQL (с которым я более знаком), и я не должен ожидать, что он будет вести себя подобным образом.

Например, использование linqpad для просмотра приводит к некоторым странным результатам.

   (from r in People where r.Name == "Michael Caine" select r).Single()

возвращает

Id             13473 
Name           Michael Caine 
Awards         Collection<TitleAward> (0 items) 
TitlesActedIn  Collection<Title> (0 items) 
TitlesDirected Collection<Title> (0 items) 

, что делает его похожим на то, что он никогда не снимался ни в одном фильме.Но

(from r in People where r.Name == "Michael Caine" select  new { r.TitlesActedIn }    ).Single().Dump();

возвращает анонимный класс {TitlesActedIn = System.Collections.ObjectModel.Collection`1 [LINQPad.User.Title]}

, который содержит 91 заголовок.

Принимая во внимание, что

(from r in People where r.Name == "Michael Caine" select   r.TitlesActedIn ).Single().Dump();

выдает ошибку: NotSupportedException: может указывать только параметры запроса (orderby, where, take, skip) после последней навигации.

Надеюсь, это поможет больше, чем запутает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...