我正在尝试创建一个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();
}
答案 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()来强制在方法中执行(我写它的方式查询实际上只会执行一旦你试图枚举它。)