C# 如何创建LINQ查询以只显示一次所有电影?
我有3个表,为了简单起见,我将使用IMDB示例(用户评级电影)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
- 表1:电影
- 表2:电影用户评级
- 表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谢谢,我不知道你可以重用别名——我最近一直坚持使用方法语法而不是查询语法