该方法将返回什么?

时间:2019-04-07 12:16:17

标签: c# entity-framework

我有一个表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;
    }

1 个答案:

答案 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);