如何通过include()使用ICollection导航属性

时间:2019-06-15 19:23:03

标签: c# linq entity-framework-core

我正在尝试使用linq在控制器中的Web api项目中使用实体框架核心来获取每个用户的项目

我尝试了此查询,但它给了我一个空对象

var users = _context.Users.Include(x => x.userProjects.Select(up => up.UserId == x.Id)).ToListAsync();

我也尝试过这个并且得到了相同的结果

var users = _context.Users.Include(x => x.userProjects.Where(up => up.UserId == x.Id)).ToListAsync();

这是User类

public class User
{
    public int Id { get; set; }
    public string Name { get; set; }


    public ICollection<UserProject> userProjects { get; set; }
}

这是Project类

public class Project
{
    public int Id { get; set; }
    public string Name { get; set; }

    public ICollection<User> Users { get; set; }
    public ICollection<UserProject> UserProjects { get; set; }
}

这是UserProject类

public class UserProject
{
    [ForeignKey("User")]
    public int UserId { get; set; }
    public User User { get; set; }

    [ForeignKey("Project")]
    public int ProjectId { get; set; }
    public Project Project { get; set; }
}

我想为每个用户及其项目数组获取一个json

2 个答案:

答案 0 :(得分:0)

var users = _context.Users.Include(u => u.userProjects)
                          .ThenInclude(up => up.Projects))
                          .Where(u => u.UserId == Id)
                          .ToListAsync();

这里发生了什么

您将检索具有UserId = yourId的所有用户以及这些用户的所有UserProjectsProjects

显示您可以访问第一个返回用户的所有项目的代码示例:

var projectsForFirstUser = users.First().Select(x => x.UserProjects).Select(x => x.Project).ToList();

编辑:由于EF Core,已修改为ThenInclude

答案 1 :(得分:0)

对于多个级别的包含,您需要ThenInclude

var users = _context.Users
                    .Include(x => x.userProjects)
                        .ThenInclude(y => y.Project)
                    .ToListAsync();