我有一个表Users,一个中间表UserMovies连接用户和电影,两者之间的关系是多对多的。用户具有的属性如dateregistered,id,name和movie具有其他10个属性。我要尝试做的只是用添加到监视列表中的电影来显示用户的名称。 逻辑很好并且可以正常工作,唯一的问题是在此服务中我需要返回什么? 如果我返回用户,则会出现一个错误,即我无法将IQuerable转换为Data.Models.User。 请帮助
public User ShowAllMoviesfromWatchlist(string userName)
{
var user2 = this.context.Users.FirstOrDefault(u => u.Name == userName);
if (user2 == null)
{
throw new ArgumentException($"Username '{userName}' does not exist");
}
var user = this.context.Users
.Include(u => u.UserMovie)
.ThenInclude(um => um.Movie)
.Select(u => new
{
u.Name,
Movie = u.UserMovie.Select(um => um.Movie.Name).ToList()
})
.Where(u => u.Name == userName);
//
var products = user.ToList();
foreach (var item in products)
{
Console.WriteLine(item.Name);
Console.WriteLine(item.Movie);
}
//var usermovies = user.UserMovie;
//return user;
return null;
}
答案 0 :(得分:1)
听起来您希望这会返回一条记录:
.Where(u => u.Name == userName);
即使只有一条匹配的记录,它仍然是记录的集合。该集合仅包含一个。也许您的意思是这样的:
.SingleOrDefault(u => u.Name == userName);
这将返回一个匹配的User
,如果没有用户匹配查询,则返回null
。 (如果存在多个匹配项,则会引发错误。在这种情况下,在这种情况下似乎不应该出现这种错误,因此如果您想知道它是否会发生,那将是一个错误。)
也不清楚您在.Select()
调用中要做什么。如果您真正想要的只是User
记录及其子项,则可以完全删除该记录。所以最终就像:
return context.Users
.Include(u => u.UserMovie)
.ThenInclude(um => um.Movie)
.SingleOrDefault(u => u.Name == userName);