【问题标题】:How can I sort a list of Employees by the SortOrder of their Roles?如何按角色的 SortOrder 对员工列表进行排序?
【发布时间】:2019-01-24 22:58:32
【问题描述】:

我正在尝试对可以具有任意数量不同角色的员工列表进行排序。角色本身按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();

在这个查询中,我试图找到每个员工(.Min(s =&gt; s.Role.SortOrder))具有最低SortOrder-number 的角色,但它没有达到我的预期。我得到了

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

【问题讨论】:

  • 创建一个数组 string[] sortOrder = {"Manager","Graphics Designer","Server-tech-guy","Web developer","Coffee Machine manager"};获取排序顺序的索引 Orderby(r => sortOrder.IndexOf(r.EmployeeRoles))
  • 您的示例中唯一可以引发此异常的方法是Min()。似乎有些员工没有角色?
  • @python_kaa 是的,就是这样。查看已接受的答案。

标签: c# linq entity-framework-core


【解决方案1】:

MinMax 方法的不可为空的重载在源序列为空时抛出异常(例如,如果您有一些 Employee 没有分配 Roles)。

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

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

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

【讨论】:

  • 谢谢!它正在做我需要的。虽然我发现我想要的是OrderBy,而不是OrderByDescending。不知道为什么我有那个。因此,我不得不将 0 更改为任意高数,如下所示:.OrderBy(r =&gt; r.EmployeeRoles.Min(s =&gt; (int?)s.Role.SortOrder) ?? 999999)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-02
  • 1970-01-01
  • 2022-01-06
相关资源
最近更新 更多