Как использовать выбрать много в лямбда-выражении MVC - PullRequest
1 голос
/ 17 марта 2012

У меня есть следующее лямбда-выражение в приложении MVC. Я хочу сгруппировать данные.

 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 ]

3 голосов
/ 17 марта 2012

ViewBag - это динамический объект (функция, представленная в .NET 4.0), и поэтому .NET не знает, к какому типу относится любое из свойств объекта.Поскольку .NET не знает тип, вы должны явно привести любые свойства к ViewBag, если хотите сохранить их в переменной.

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

И преобразовать что-либо в тип Movie, который вам понадобитсяизменить исходный запрос LINQ для выбора фильмов, а не анонимных типов.

2 голосов
/ 18 марта 2012

Тип коллекции, которую вы передаете в , не и 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;
0 голосов
/ 18 марта 2012

Это из-за анонимного объекта в вашей 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;

Я подозреваю, что это не то, что вы на самом деле хотите сделать, но я не могу помочь без дополнительной информации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...