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

时间:2012-03-17 18:28:12

标签: c# asp.net-mvc entity-framework-4 lambda

我在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?)

任何帮助都会得到满足。

3 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分:2)

您在中传递的集合类型不是 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;

答案 2 :(得分:0)

这是因为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;

我怀疑这不是你真正想做的事情,但如果没有更多的信息,我无法帮助。