我有這些關系表:
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 的串列,這個函式應該是什么樣的?
uj5u.com熱心網友回復:
EF 為表定義物體。您的架構有一個多對多 EmployeeRoles 表,用于關聯員工和角色之間的關聯,因此物體應如下所示:
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 的集合/串列,那么您的團隊需要閱讀有關使用 Navigation Properties 建立關系的內容。對于幾乎所有這樣的關系,不需要在 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類似的方法稱為 Projection,它將讓 EF 構建查詢以僅檢索有關填充詳細資訊所需的 Employee 和關聯角色的欄位。假設您需要每個關聯角色的 ID 和名稱,您將創建一個簡單的 DTO (RoleData) 并Select在 Employee.Roles 中使用以從角色物體/表中填充。
uj5u.com熱心網友回復:
如果我想得到一個 RoleName 而不是 RoleId 的串列,這個函式應該是什么樣的?
.Select(s => s.Role.RoleName)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/459596.html
