Запросить все заголовки по актерам с помощью LINQ to Netflix OData

Я экспериментирую с LINQPad, чтобы использовать LINQ для запроса OData Netflix. Я пытаюсь найти все фильмы с участием определенного актера. Например:

from t in Titles 
from p in t.Cast
where p.Name == "Morgan Freeman"
select t.Name

это приводит к:

NotSupportedException: может проецировать только последний тип объекта в переводимом запросе.

Я также пробовал:

from p in People
from t in p.TitlesActedIn
where p.Name == "Morgan Freeman"
select t.Name

что приводит к следующей ошибке:

NotSupportedException: метод «Выбрать» не поддерживается

Я пробовал несколько других подходов, таких как использование идентификаторов в предложении where и выбор разных вещей, но ничего не добился.


person Mark Heath    schedule 03.06.2010    source источник


Ответы (1)


Вы можете сделать это:

from p in People
where p.Id == 190
from t in p.TitlesActedIn
select new { Name = t.Name }

Но обратите внимание, что для этого требуется, чтобы вы не указывали идентификатор, это переводится как: /People(190)/TitlesActedIn?$select=Name

Если вам нужно фильтровать на основе неключевых свойств, вам нужно сделать что-то вроде:

from p in People
where p.Name == "Morgan Freeman"
select new Person {
    TitlesActedIn = p.TitlesActedIn
}

Это переводится как: /People?$filter=Name eq 'Morgan Freeman'&$expand=TitlesActedIn

Вы также можете просто запросить названия этих заголовков, но у LinqPad, похоже, нет способа сделать это из-за типа свойств, которые он генерирует. Это будет выглядеть так:

from p in People
where p.Name == "Morgan Freeman"
select new Person {
    TitlesActedIn = p.TitlesActedIn.Select(t => new Title { Name = t.Name })
}

Что переводится как: /People?$filter=Name eq 'Morgan Freeman'&$expand=TitlesActedIn&$select=TitlesActedIn/Name

Спасибо, Витек Карас [MSFT]

person Vitek Karas MSFT    schedule 10.06.2010
comment
благодаря. Я попробовал ваше третье предложение, но у него была недопустимая ошибка приведения. У меня это работает со следующим LINQ: from p в People, где p.Name == Morgan Freeman select new { TitlesActedIn = p.TitlesActedIn.Select(t => t.Name)} - person Mark Heath; 11.06.2010