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

C# 如何创建LINQ查询以只显示一次所有电影?,c#,entity-framework,linq,join,distinct-values,C#,Entity Framework,Linq,Join,Distinct Values,我有3个表,为了简单起见,我将使用IMDB示例(用户评级电影) 表1:电影 表2:电影用户评级 表3:用户 电影(3部电影): ID MOVIE_NAME 1 Movie1 2 Movie2 3 Movie3 MOVIE_ID USER_ID RATING 1 1 10 1 2 9 ID USER_NAME 1 User1 2 User2 Mo

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

  • 表1:电影
  • 表2:电影用户评级
  • 表3:用户
电影(3部电影):

ID  MOVIE_NAME  
1   Movie1  
2   Movie2  
3   Movie3  
MOVIE_ID    USER_ID RATING  
1             1       10  
1             2        9  
ID  USER_NAME  
1   User1  
2   User2  
MovieUserRating(两个用户仅对电影1进行评级):

ID  MOVIE_NAME  
1   Movie1  
2   Movie2  
3   Movie3  
MOVIE_ID    USER_ID RATING  
1             1       10  
1             2        9  
ID  USER_NAME  
1   User1  
2   User2  
用户(2个用户):

ID  MOVIE_NAME  
1   Movie1  
2   Movie2  
3   Movie3  
MOVIE_ID    USER_ID RATING  
1             1       10  
1             2        9  
ID  USER_NAME  
1   User1  
2   User2  
所以,如果有任何用户登录(例如User1),我需要执行LINQ查询,该查询将返回所有电影的列表和登录用户对它们的评级。若电影未被登录用户分级,它将显示0

因此,我需要这样的结果(如果user1已登录):

如果用户2已登录:

MOVIE       RATING  
Movie1        10  
Movie2         0  
MOVIE       RATING  
Movie1        9  
Movie2        0  
MOVIE       RATING  
Movie1        9  
Movie1        0  
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已登录):

(如果2已登录):

如何修复此问题以获得所需的结果(电影1只放映一次)


提前感谢您的帮助。

您的查询不是按登录用户筛选结果,而是仅更改选定的值。您可以尝试以下方法:

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合并运算符。

您需要
加入
您的条目。您还可以使用匿名类型在
on
子句上设置筛选器,以检查
ID
用户ID
任何其他人都不喜欢这种语法如何导致您为加入的实体使用3个别名,例如
mur
murs
mmur
@ChrisMoutray虽然没有必要,但我不知道为什么人们倾向于使用不同的别名。在
into
子句之后,
mur
范围变量超出了范围,因此可以使用它来代替
mmur
@ChrisMoutray我知道这是一堆别名,但我认为对于初学者来说它会更为明确(谁不知道范围,我也会模棱两可)。@Ivan ah谢谢,我不知道你可以重用别名——我最近一直坚持使用方法语法而不是查询语法