使用LINQ to Netflix OData通过MovieId请求类型

时间:2010-10-14 02:10:39

标签: linq odata netflix

我正在尝试创建一个LINQ查询以通过movieid返回流派。 LINQ在LINQPAD4中工作。有人可以用正确的语法帮助我吗?我收到以下错误:

  

无法将类型'System.Linq.IQueryable'隐式转换为'System.Linq.IQueryable'。存在显式转换(您是否错过了演员?)

  

无法将类型'System.Collections.Generic.List'隐式转换为'System.Collections.Generic.List'

代码:(注意我在括号中包含了以下行中的标题,但在我的代码中实际上是括号。

  

公共列表(类型)GetGenresByMovieId(string movieid)
  {
    var genres =来自MovieCatalog.Titles中的t     其中t.Id ==“BVlLx”
    选择t.Genres;     return genres.ToList();
  }

2 个答案:

答案 0 :(得分:0)

你的问题是你的预测:

select new { Name = g.Name }

即将查询投影到匿名类型

您需要投射到已声明的IQueryable(IQueryable<Genre>

使用LINQ查询时,最好使用隐式类型变量(var)。

此外,不确定为什么你在查询中有额外的“来自”,你不需要它。

这样的事情应该有效:

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>)。

但是,我不知道NetFlix OData API,但这应该会让你走上正轨。

答案 1 :(得分:0)

正确的查询看起来像

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,因为titles上的过滤器会返回一个标题列表(它们总是只包含一个标题,但是编译器不知道),所以你想要为结果中的每个标题“连接”所有类型。

返回类型实际上是IQueryable,但是如果你只计划对它进行枚举,你可以使用IEnumerable,或者调用ToList()来强制在方法中执行(我写它的方式查询实际上只会执行一旦你试图枚举它。)