Entity Framework 从多个表中选择列(对于 ThenInclude)?

Entity Framework Selecting columns from multiple tables (for ThenInclude)?

我有关于 select 的问题...

var applicationUser = unitOfWork.ApplicationUsers.GetAll().Include(i => i.ApplicationUserRoles).ThenInclude(i => i.ApplicationRole)
.Where(i => i.UserName.ToUpper() == userName.ToUpper())
.Select(i => new
{
    i.Email,
    i.FirstName,
    i.LastName,
    i.PhoneNumber,
    i.ImageUrl,
    i.JoinedDate,
    i.DateOfBirth,
    i.ApplicationUserRoles
})
.FirstOrDefault();

我无法获取 ApplicationRole 如何在 select 中使用它?

如果您使用 Select 的投影,则不需要使用 Include。只是 select 值。要通过 UserRoles 获取角色,您需要 Select 来检索这些角色:

var applicationUser = unitOfWork.ApplicationUsers.GetAll()
.Where(i => i.UserName.ToUpper() == userName.ToUpper())
.Select(i => new
{
    i.Email,
    i.FirstName,
    i.LastName,
    i.PhoneNumber,
    i.ImageUrl,
    i.JoinedDate,
    i.DateOfBirth,
    ApplicationRoles = i.ApplicationUserRoles.Select(x => x.ApplicationRole).ToList()
})
.FirstOrDefault();

您可以通过子select仅从应用程序角色中获取您需要的角色详细信息来进一步优化...

    // ...
    ApplicationRoles = i.ApplicationUserRoles.Select(x => 
       x.ApplicationRole.Select(ar => new { ar.RoleId, ar.RoleName })).ToList()

如果您最多期望 1 个结果,我建议使用 SingleOrDefault 而不是 FirstOrDefaultFirst/FirstOrDefault 应始终与 OrderBy/OrderByDescending 条件一起使用,以确保可预测的结果。

如果我可以使用 ApplicationRoles,它就可以工作

.Select(i => new
{i.Email,i.FirstName,i.LastName,i.PhoneNumber,i.ImageUrl,i.JoinedDate,i.DateOfBirth,
ApplicationRoles = i.ApplicationUserRoles.Select(x => x.ApplicationRole).ToList(),
})

我不能使用 ApplicationUserRoles 它是如何工作的?

public class ApplicationUserSummary
{
    public DateTime JoinedDate { get; set; }
    public string ImageUrl { get; set; }
    public string Email { get; set; }
    public string PhoneNumber { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public DateTime? DateOfBirth { get; set; }
    public ICollection<ApplicationRole> ApplicationRoles { get; set; }
    public ICollection<ApplicationUserRole> ApplicationUserRoles { get; set; }
}