Я думаю, что могу дать вам запрос, который работает, но я не могу объяснить, почему ваш запрос не работает (если вы не достаточно довольны «Становится его 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) после последней навигации.
Надеюсь, это поможет больше, чем запутает.