2012-03-17 3 views
1

MVC application.i에서 다음 람다식이 있습니다. 데이터를 그룹화하고 싶습니다.람다 식으로 많이 선택하는 방법 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; 
     } 

이 내용을 내보기에 전달하고 싶습니다. 내가 어떤 도움이 appriciated됩니다

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

이 오류를 내보기

IEnumerable<Movie> TopMovies = ViewBag.TopMovie; 

에 다음과 같은 기록 만 가지고보십시오.

+1

는 타입인가

그래서 당신은 예를 들어, 다음 쿼리를 사용할 수 있습니다 ViewBag.TopMovie 객체에? 아마도 형식을 변경하거나 IEnumerable 으로 캐스팅해야합니다. –

+1

[selectmany를 groupby와 MVC보기로 결합하는 방법]의 복제본 (http://stackoverflow.com/questions/9751825/how-to-pass-selectmany-combine-with-groupby-to-mvc-view) – nemesv

답변

2

에 전달할 컬렉션 유형이이고 IEnumerable<Movie>이 아닙니다. 익명 형식을 사용하고 있으며 GroupBy도 사용하고 있습니다. 결과 유형은 복잡합니다.

Rating에 액세스하고 있지만 사용하지 않았기 때문에 검색어도 의미가 없으므로 동일한 영화의 여러 사본과 모든 평가 정보가 삭제 된 것일 수 있습니다. 잠시 동안 나는 당신이 실제로 을 원하는 것으로 가정합니다. 등급이 포함됩니다.당신이보기에 그 사용할 수 있도록 이제 위의 쿼리의 유형, List<IGrouping<Movie, 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>> ratings = ViewBag.Ratings; 
+0

옳은 대답 이었지만 영화는 한 번만 나오고 순서가 가장 높은 등급으로 인쇄되기를 원합니다. 가장 높은 등급의 영화가 5 번인 경우 1 번으로 표시하고 4 번은 4 번 등호를 따릅니다. 감사합니다. – JED

+0

@JED : 좋아요. 그래서 .Count를 사용하여 평점의 수를 결정하고 '.OrderByDescending'을 그것으로 정렬합니다. :) – Timwi

+0

yean 그것은 – JED

3

ViewBag는 동적 객체 (.NET 4.0에서 도입 된 기능)이므로 .NET은 객체의 어떤 유형의 속성인지 알지 못합니다. .NET은 유형을 인식하지 못하기 때문에 변수에 저장하려는 경우 ViewBag의 모든 속성을 명시 적으로 형 변환해야합니다.

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

그리고 당신은 영화와 익명되지 유형을 선택 원래 LINQ 쿼리를 변경해야합니다 영화의 종류에 아무것도 변환.

+0

나는 새로운 선택 때문이라고 생각한다. the movieID = MovieTitle = difinition 유형이 없습니다 – JED

+0

원래 검색어에서 무엇을 선택하려고하십니까? 모든 영화의 모든 등급을 선택하는 것이 이상하게 보입니다. 각 영화의 평균 등급이 필요합니까? –

0

SelectMany 및 GroupBy의 익명 개체 때문입니다.

GroupBy는 IEnumerable을 반환하지 않고 본질적으로 각 하위 모음이 동일한 키 값을 가진 모음집을 반환합니다 (IEnumerable<IGrouping<TKey, TSource>>). 당신이 가지고있는 경우

는 영화에 의해 그룹화 이드 당신에게 오히려 이상한 컬렉션을 제공하는 것입니다 : 그런

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; 

은 그래도 의심하지만 나는 더 많은 정보없이 도울 수 없어요 .

관련 문제