如何编写查询以从 Entity Framework 中的两个表中获取数据

How to write a query to get data from two tables in Entity Framework

我有这些表与这些关系:

https://i.stack.imgur.com/xUbeu.png

我写了这些代码:

public class TestData
{
    public int EmployeeId { get; set; }
    public string Email { get; set; }
    public string Password { get; set; }
    public string FullName { get; set; }
    public string Avatar { get; set; }
    public bool IsActive { get; set; }
    public List<int> Roles { get; set; }

}

   public TestData GetData(string email)
    {
        var employee = _CarRentalContext.Employees.SingleOrDefault(w => w.Email == email);
        List<int> Roles = _CarRentalContext.EmployeesRoles
            .Where(w => w.EmployeeId == employee.EmployeeId)
            .Select(s => s.RoleId).ToList();

        return new TestData()
        {
            EmployeeId = employee.EmployeeId,
            FullName=employee.FullName,
            Email=employee.Email,
            Password=employee.Password,
            IsActive=employee.IsActive,
            Avatar=employee.Avatar,
            Roles = Roles,
        };
    }

现在写这个函数最好的方法是什么? 如果我想获取 RoleName 而不是 RoleId 的列表,这个函数应该是什么样的?

And if I want to get a list of RoleName instead of RoleId, what should this function look like?

.Select(s => s.Role.RoleName)

EF 为 table 定义实体。您的架构有一个 many-to-many EmployeeRoles table 用于员工和角色之间的关联,因此实体应如下所示:

public class Employee
{
    public int EmployeeId { get; set; }
    // ...
    public virtual ICollection<Role> Roles { get; set; } = new List<Role>();
    // or 
    // public virtual ICollection<EmployeeRole> EmployeeRoles { get; set; } = new List<EmployeeRole>();
}

如果 Employee 没有公开 Role 或 EmployeeRole 的 collection/list,那么您的团队需要阅读有关使用导航属性建立关系的信息。对于几乎所有这样的关系,都不需要在 DbContext 中为加入的 EmployeeRole 实体提供 DbSet。要填充 TestData DTO,您只需要:

var testdata = _CarRentalContext.Employees
   .Where(w => w.Email == email)
   .Select(w => new TestData
   {
       EmployeeId = w.EmployeeId,
       FullName=w.FullName,
       Email=w.Email,
       Password=w.Password,
       IsActive=w.IsActive,
       Avatar=w.Avatar,
       Roles = w.Roles.Select(r => new RoleData
       {
           RoleId = r.RoleId,
           Name = r.Name
       }).ToList()
   }).SingleOrDefault();

如果 Employee 有一个 EmployeeRoles 集合,那么它有点 更丑陋,将内部 Roles= 替换为 :

       Roles = w.EmployeeRoles.Select(er => new RoleData
       {
           RoleId = er.Role.RoleId,
           Name = er.Role.Name
       }).ToList()

...通过 EmployeeRole 深入了解角色。

像这样使用 Select 称为投影,它将让 EF 构建查询以仅检索有关您需要填充详细信息的员工和相关角色的字段。假设您需要每个关联角色的 ID 和名称,您将创建一个简单的 DTO (RoleData) 并在 Employee.Roles 中使用 Select 从角色 entity/table.[=15 中填充=]