我在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?)
任何帮助都会得到满足。
答案 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;
我怀疑这不是你真正想做的事情,但如果没有更多的信息,我无法帮助。