Запросить жанры по MovieId, используя LINQ to Netflix OData - PullRequest
0 голосов
/ 14 октября 2010

Я пытаюсь создать запрос LINQ для возврата жанров по movieid. LINQ работает в LINQPAD4. Может ли кто-нибудь помочь мне с правильным синтаксисом? Я получаю следующие ошибки:

Невозможно неявно преобразовать тип 'System.Linq.IQueryable' в 'System.Linq.IQueryable'. Существует явное преобразование (вам не хватает приведения?)

и

Невозможно неявно преобразовать тип 'System.Collections.Generic.List' в 'System.Collections.Generic.List'

Код: (обратите внимание, что заголовок в следующей строке заключен в скобки, но на самом деле это мой код в скобках.

публичный список (жанр) GetGenresByMovieId (string movieid)
{
var genres = from t в MovieCatalog.Titles
где t.Id == "BVlLx"
выберите t.Genres; возвращать жанры. ToList ();
} * * Тысяча двадцать-один

Ответы [ 2 ]

0 голосов
/ 14 октября 2010

Правильный запрос будет выглядеть как

public IEnumerable<Genre> GetGenresByMovieId(string movieId)
{
    return from title in ctx.Titles
           from genre in title.Genres
           where title.Id == "BVlLx"
           select genre;
}

В синтаксисе вызова метода необходимо использовать SelectMany, а не Select, поскольку фильтр по заголовкам возвращает список заголовков (который всегда будет содержать только одинtitle, но компилятор этого не знает) и поэтому вы хотите "объединить" все жанры для каждого заголовка в результатах.

Тип возвращаемого значения на самом деле IQueryable, но если вы планируете только перечислять егоВы можете использовать IEnumerable или вызвать ToList () для принудительного выполнения прямо в методе (как я написал, запрос фактически будет выполняться только после того, как вы попытаетесь перечислить его).

0 голосов
/ 14 октября 2010

Ваша проблема - ваша проекция:

select new { Name = g.Name }

То есть проектирование запроса в анонимный тип .

Вам необходимо проецировать в объявленный вами IQueryable(IQueryable<Genre>)

При работе с запросами LINQ предпочтительно использовать переменные с неявной типизацией (var).

Кроме того, не уверен, почему в запросе есть такое дополнительное «from»вам это не нужно.

Что-то вроде этого должно работать:

var genres = from t in MovieCatalog.Titles
             where t.Id = "BVlLx"
             select t.Genres;

return genres.ToList();

var genres должно быть набрано в IQueryable<Genre>.

Это предполагаетвы хотите вернуть коллекцию объектов Genre.

Если вам просто нужно имя, сделайте следующее:

select t.Genres.Name

Но это вернет коллекцию строковых объектов (и var genres следуетнаберите IQueryable<string>).

Однако я не имею понятия об API-интерфейсе NetFlix OData, но это должно помочь вам в правильном направлении.

...