代码之家  ›  专栏  ›  技术社区  ›  obautista

使用linq-to-netflix-odata按movieid请求流派

  •  0
  • obautista  · 技术社区  · 14 年前

    我正在尝试创建一个LINQ查询来按movieid返回流派。Linq在LinqPad4工作。有人能帮我正确的语法吗?我收到以下错误:

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

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

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

    公共列表(流派)getgenresbymovieid(字符串movieid)
    {
    var genres=来自moviecatalog.titles中的t
    其中t.id=“bvllx”
    选择T.流派; 返回genres.tolist();
    }

    2 回复  |  直到 14 年前
        1
  •  0
  •   Vitek Karas MSFT    14 年前

    正确的查询如下

    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,因为对标题的筛选返回标题列表(始终只包含一个标题,但编译器不知道),因此您希望“连接”结果中每个标题的所有类型。

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

        2
  •  0
  •   RPM1984    14 年前

    你的问题在于你的预测:

    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<流派> .

    这是假设您要返回流派对象的集合。

    如果您只想知道姓名,请执行以下操作:

    select t.Genres.Name
    

    但这将返回字符串对象的集合(和 var类型 应键入到 IQueryable<string> )

    但是,我不知道NetflixOdata API,但是这会让您走上正确的道路。