C# 此方法将返回什么?
我有一个表Users,一个连接用户和电影的中间表UserMovies,其中的关系是多对多的。用户具有dateregistered、id、name等属性,而movie具有10个其他属性。我想做的就是用用户添加到观察列表中的电影显示用户的名字。 逻辑是好的,它正在工作,唯一的问题是我需要在这个服务中返回什么? 如果我返回user,则会出现一个错误,即我无法将IQuerable转换为Data.Models.user。 请帮忙C# 此方法将返回什么?,c#,entity-framework,C#,Entity Framework,我有一个表Users,一个连接用户和电影的中间表UserMovies,其中的关系是多对多的。用户具有dateregistered、id、name等属性,而movie具有10个其他属性。我想做的就是用用户添加到观察列表中的电影显示用户的名字。 逻辑是好的,它正在工作,唯一的问题是我需要在这个服务中返回什么? 如果我返回user,则会出现一个错误,即我无法将IQuerable转换为Data.Models.user。 请帮忙 public User ShowAllMoviesfromW
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;
}
听起来您希望它返回一条记录:
.Where(u => u.Name == userName);
即使只有一条匹配的记录,它仍然是一组记录。该集合仅包含一个。也许你的意思是这样的:
.SingleOrDefault(u => u.Name == userName);
这将返回一个匹配的User
,如果没有用户匹配查询,则返回null
。(如果存在多个匹配项,则会抛出一个错误。从语义上看,在本例中不应该出现这种情况,因此如果发生这种情况,您可能会想知道这是一个错误。)
在.Select()
调用中,您试图做什么也不完全清楚。如果您真正想要的只是用户
记录及其子项,那么您可以完全删除它。所以最终就像:
return context.Users
.Include(u => u.UserMovie)
.ThenInclude(um => um.Movie)
.SingleOrDefault(u => u.Name == userName);
谢谢大卫的迅速回复。我想返回与名字和他在观察列表中的电影相匹配的用户。另外,如果我输入.SingleorDefault,它将具体化,我将无法返回电影列表。@grozdeto:您想返回单个对象还是对象列表?你需要下决心。这个方法应该返回什么?为什么这个方法要写入控制台呢?这里的目标是什么?我希望这个方法返回一个用户的电影列表。我使用“选择”来选择要返回的属性-仅返回用户名和电影名称。@grozdeto:答案末尾的代码正是这样做的。它返回一个
用户
对象,包括其子记录。不要担心具体选择哪些列。为了简单起见,只需返回整个对象,然后只在UI中输出所需的数据。否则,您将与半填充的用户
或匿名类型进行斗争。