0

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

无法将类型“System.Linq.IQueryable”隐式转换为“System.Linq.IQueryable”。存在显式转换(您是否缺少演员表?)

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

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

公共列表(流派)GetGenresByMovieId(字符串movieid)
{
var流派=来自MovieCatalog.Titles中的t,
其中t.Id ==“BVlLx”
选择t.Genres;返回流派.ToList();
}

4

2 回答 2

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,但这应该会让你走上正轨。

于 2010-10-14T02:34:35.487 回答
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,因为标题上的过滤器会返回一个标题列表(它总是只包含一个标题,但编译器不知道),所以您想要“连接" 结果中每个标题的所有类型。

返回类型实际上是 IQueryable,但如果您只打算对其进行枚举,则可以使用 IEnumerable,或调用 ToList() 以在方法中强制执行(我编写它的方式,查询实际上只会在您尝试时执行枚举它)。

于 2010-10-14T06:13:48.307 回答