如何在lambda表达式mvc中使用select many

本文关键字:select many mvc lambda 表达式 | 更新日期: 2023-09-27 18:28:04

我在MVC应用程序中有以下lambda表达式。我想对数据进行分组。

 var toprating=  _db.Movie.SelectMany(m => m.Rating.Select(r=> new 
            {
           movieID=r.MovieID,
           MovieTitle= m.Title
            })).GroupBy(m=>m.movieID).ToList();
      ViewBag.TopMovie = toprating;
        }

我想把这个传给我的观点。我试着在中写以下内容

 IEnumerable<Movie> TopMovies = ViewBag.TopMovie;

但是得到了这个错误

Cannot implicitly convert type 'object' to 'System.Collections.Generic.IEnumerable<Movie>'. An explicit conversion exists (are you missing a cast?)

任何帮助都会得到通知。

如何在lambda表达式mvc中使用select many

ViewBag是一个动态对象(.NET 4.0引入的一项功能),因此.NET不知道对象上的任何属性是什么类型。由于.NET不知道类型,如果要将任何属性存储在变量中,则必须显式强制转换ViewBag上的所有属性。

 var topMovies = ViewBag.TopMovie as IEnumerable<Movie>;

要将任何内容转换为电影类型,您需要更改原始LINQ查询以选择电影而不是匿名类型。

传入的集合类型不是IEnumerable<Movie>。请注意,您正在使用匿名类型,然后您也在使用GroupBy。生成的类型很复杂。

您的查询也没有意义,因为您正在访问Rating,但没有使用它,所以您可能最终会得到同一部电影的多个副本,并丢弃所有评级信息。目前,我假设您实际上想要包含的评分。

因此,您可以使用以下查询,例如:

ViewBag.Ratings = _db.Movie.SelectMany(m => m.Rating.Select(r => new 
{
    Movie = m,
    Rating = r
})).GroupBy(m => m.Movie, m => m.Rating).ToList();

现在上面查询的类型是List<IGrouping<Movie, Rating>>,所以您可以在视图中使用它:

List<IGrouping<Movie, Rating>> ratings = ViewBag.Ratings;

这是因为SelectMany和GroupBy中的匿名对象。

GroupBy不返回IEnumerable,而是返回IEnumerable<IGrouping<TKey, TSource>>——本质上是一个集合集合,其中每个子集合具有相同的键值。

在这种情况下,按电影Id分组会给你一个相当奇怪的集合:

toprating: [
    [
       // MovieID, Movie Title
        { 1, Movie1Title },   // one Id/title pair for every rating.
        { 1, Movie1Title },
        { 1, Movie1Title },
        ...
    ],
    [
        { 2, Movie2Title },   // one title for every rating.
        { 2, Movie2Title },
        { 2, Movie2Title },
        ...
    ]
]

类似的东西,但如果这真的是你想要的,好吧。然后在你看来,你正试图做到这一点:

IEnumerable<Movie> TopMovies = ViewBag.TopMovie;

但TopMovie是IEnumerable<IGrouping<int, object>>。所以它当然不能被选为电影。

这将给你对象,并允许你枚举它:

IEnumerable<IGrouping<int, object>> TopMovies = ViewBag.TopMovie;

虽然我怀疑这不是你真正想做的,但如果没有更多信息,我也无能为力。