Как отсортировать список сотрудников по порядку сортировки их ролей? - PullRequest
0 голосов
/ 24 января 2019

Я пытаюсь отсортировать список сотрудников, которые могут иметь любое количество разных ролей. Сами роли отсортированы по свойству 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 голосов
/ 24 января 2019

Ненулевые перегрузки методов Min и Max выдают исключение, когда исходная последовательность пуста (например, если у вас есть Employee без назначенных Role с).

Однако, допускает значение NULL.перегрузки не выдают исключение, а просто возвращают null.Следовательно, решение состоит в том, чтобы преобразовать ненулевой тип в соответствующий обнуляемый тип.Кроме того, оператор ?? может использоваться для назначения специального значения для этого случая.

В вашем случае это может быть что-то вроде этого:

.OrderByDescending(r => r.EmployeeRoles.Min(s => (int?)s.Role.SortOrder) ?? 0)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...