如何创建LINQ查询只显示一次所有电影?

时间:2017-04-19 13:19:45

标签: c# entity-framework linq join distinct-values

我有3个表格,为简单起见,我将使用IMDB示例(用户评级电影)。

  • 表1:电影
  • 表2:MovieUserRating
  • 表3:用户。

电影(3部电影):

ID  MOVIE_NAME  
1   Movie1  
2   Movie2  
3   Movie3  

MovieUserRating(两位用户仅评为电影1):

MOVIE_ID    USER_ID RATING  
1             1       10  
1             2        9  

用户(2位用户):

ID  USER_NAME  
1   User1  
2   User2  

因此,如果有任何用户登录(例如User1),我需要执行LINQ查询,该查询将返回所有电影的列表并记录用户的评级。如果已登录用户未评价电影,则会显示0。

所以,我需要看起来像这样的结果(如果user1已登录):

MOVIE       RATING  
Movie1        10  
Movie2         0  

如果user2已登录:

MOVIE       RATING  
Movie1        9  
Movie2        0  

所以,这是我在ASP.NET控制器中的查询(不好):

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  
        };  

不幸的是,此查询返回Movie1两次,因为它已被两个用户评级。所以,结果如下:

(如果用户1已登录):

MOVIE       RATING  
Movie1        10  
Movie1         0  
Movie2         0  

(如果2已登录):

MOVIE       RATING  
Movie1        9  
Movie1        0  
Movie2        0  

如何解决此问题以获得我需要的结果(电影1仅显示一次)?

提前感谢您的帮助。

1 个答案:

答案 0 :(得分: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运算符一样。