我有3个表格,为简单起见,我将使用IMDB示例(用户评级电影)。
电影(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仅显示一次)?
提前感谢您的帮助。
答案 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运算符一样。