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

时间:2019-01-24 14:30:51

标签: c# linq entity-framework-core

我正在尝试对可以具有许多不同角色的员工进行排序。角色本身通过SortOrder属性进行排序,我希望根据分配给他们的所有角色中排名最高的员工对员工进行排序。

例如:

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

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

这是我的模特:

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();

在此查询中,我试图找到每个员工的最低SortOrder编号(.Min(s => s.Role.SortOrder),但它没有达到我的预期。我得到了

  

InvalidOperationException:序列不包含任何元素。

1 个答案:

答案 0 :(得分:5)

当源序列为空时(例如,如果您有一些Min而未分配Max时),EmployeeRole方法的不可为空的重载会引发异常。 / p>

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

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

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