2017-04-19 10 views
1

나는 3 개의 테이블을 가지고 있으며 단순화를 위해 IMDB 예제 (사용자 등급 영화)를 사용할 것입니다.모든 동영상을 한 번만 표시하도록 LINQ 쿼리를 만드는 방법은 무엇입니까?

  • 표 1 : 영화
  • 표 2 :
  • 표 3 MovieUserRating : 사용자.

영화 (3 동영상) :

ID MOVIE_NAME 
1 Movie1 
2 Movie2 
3 Movie3 

MovieUserRating (단지 영화 일을 평가 두 사용자) :

MOVIE_ID USER_ID RATING 
1    1  10 
1    2  9 

사용자 (2 명 사용자) :

ID USER_NAME 
1 User1 
2 User2 

그래서 어떤 사용자 (예 : User1)에 로그인 한 경우 모든 영화 및 기록 된 사용자의 등급 목록을 반환하는 LINQ 쿼리를 실행해야합니다. 동영상이 기록 된 사용자에 의해 평가되지 않은 경우 (USER1은 로그인 한 경우) 0

그래서, 내가 같이하는 결과를 필요로 보여 것 :

MOVIE  RATING 
Movie1  10 
Movie2   0 

1 및 사용자가 로그인되어있는 경우 :

var results = 
    from m in db.Movies 
    from mur in db.MoveUserRatings.Where(mur => mur.MOVIE_ID == m.ID).DefaultIfEmpty() 
    from u in db.Users.Where(u=>u.ID == mur.USER_ID).DefaultIfEmpty() 
     select new MyModelViewClass 
     { 
      MovieName = m.MOVIE_NAME,   
      MovieRating = (u.Id == “user ID that was supplied”) ? mur.RATING : 0 
     }; 

불행하게도,이 쿼리 retur : 그래서

MOVIE  RATING 
Movie1  9 
Movie2  0 

이는 ASP.NET 컨트롤러 내 쿼리 (좋지 않은)입니다 ns Movie1을 두 번 평가했습니다. 그래서, 결과는 다음과 같다 : (사용자 1은 로그인 한 경우)

: (2 로그인 한 경우)

MOVIE  RATING 
Movie1  10 
Movie1   0 
Movie2   0 

:

MOVIE  RATING 
Movie1  9 
Movie1  0 
Movie2  0 

이 어떻게 결과를 얻기 위해이 문제를 해결할 수 있습니다 내가 필요해 (영화 1은 한 번만 보여줍니다)?

미리 도움을 청하십시오.

+0

당신은 당신의 엔트리를'join '할 필요가 있습니다. http://stackoverflow.com/q/5537995/81053 –

답변

2

귀하의 질의는 기록 된 사용자에 의한 결과를 필터링하는 것이 아니라 선택된 값을 변경하는 것입니다. 이것을 시도 할 수 있습니다 :

var results = 
    from m in db.Movies 
    join mur in db.MoveUserRatings.Where(k=> k.USER_ID == “user ID that was supplied”) on m.ID equals mur.MOVIE_ID into murs 
    from mmur in murs.DefaultIfEmpty() 
    select new MyModelViewClass 
    { 
     MovieName = m.MOVIE_NAME, 
     MovieRating = mmur.RATING ?? 0 
    }; 

참고 : '??' SQL COALESCE 연산자와 같습니다.

+1

또한'on' 절에 필터를 설정할 수 있습니다. 익명 형을 사용하여'ID'와' USER_ID' – bradbury9

+0

그 밖의 다른 사람들은 'mur','murs','mmur'와 같이 조인 된 엔티티에 3 개의 별명을 부여하는 방법에 대해 싫어합니다. –

+1

@ChrisMoutray 필요하지는 않습니다. 왜 사람들이 다른 용도로 사용하는 지 잘 모르겠습니다. 별칭. 'into' 절 뒤에는'mur' 범위 변수가 범위를 벗어나므로'mmur' 대신 사용할 수 있습니다. –