代码之家  ›  专栏  ›  技术社区  ›  Stian

如何按员工角色的排序顺序对员工列表进行排序?

  •  2
  • Stian  · 技术社区  · 6 年前

    我正在整理一个员工列表,其中可以有任意多个不同的角色。角色本身按 SortOrder 属性,我希望根据分配给员工的所有角色的顶部排序对员工进行排序。

    例如。:

    SortOrder - Role
    1 - "Manager"
    2 - "Graphics designer"
    3 - "Server-tech-guy"
    4 - "Web developer"
    5 - "Coffee Machine manager"
    

    一个员工既可以是图形设计师,也可以管理咖啡机。在这种情况下,我只想使用 排序顺序 对员工列表排序时的角色“图形设计器”。

    以下是我的模型:

    public class Employee
    {
        public int Id { get; set; }
        public int BranchId { get; set; }
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public string Phone { get; set; }
        public string Email { get; set; }
        public double EmploymentPercentage { get; set; }
        public double HourlyWage { get; set; }
        public List<EmployeeRole> EmployeeRoles { get; set; }
        public Branch Branch { get; set; }
    }
    
    public class EmployeeRole
    {
        public int Id { get; set; }
        public int EmployeeId { get; set; }
        public int RoleId { get; set; }
        public Employee Employee { get; set; }
        public Role Role { get; set; }
    }
    
    public class Role
    {
        public int Id { get; set; }
        public string Title { get; set; }
        public int SortOrder { get; set; }
    
        public Branch Branch { get; set; }
    }
    

    这是我目前为止的问题:

    List<Employee> employees = await db.Employees
        .Include(er => er.EmployeeRoles)
            .ThenInclude(r => r.Role)
        .Where(b => b.Branch.Id == BranchId)
        .OrderByDescending(r => r.EmployeeRoles.Min(s => s.Role.SortOrder))
            .ThenByDescending(p => p.EmploymentPercentage)
                .ThenBy(n => n.LastName)
        .ToListAsync();
    

    在这个查询中,我试图查找角色 排序顺序 -每位员工的人数( .Min(s => s.Role.SortOrder) 但这并不是我所期望的。我得到

    InvalidOperationException:序列不包含元素。

    1 回复  |  直到 6 年前
        1
  •  5
  •   Ivan Stoev    6 年前

    的不可为空的重载 Min Max 方法在源序列为空时引发异常(例如,如果您有 Employee 未分配 Role s)。

    但是,可以为空的重载不会引发异常,而只是返回 null . 因此,解决方案是将不可为空的类型提升为相应的可为空的类型。另外 ?? 运算符可用于为该情况指定一个特殊值。

    在您的情况下,它可以是这样的:

    .OrderByDescending(r => r.EmployeeRoles.Min(s => (int?)s.Role.SortOrder) ?? 0)