c# - 使用 Linq 的多个复选框选择结果,无需硬编码

标签 c# asp.net-mvc linq asp.net-mvc-4 linq-to-entities

数据库示意图(实际列名和表名不同)

EmployeeeID      IsSicked   IsRetired    IsHoliday  
1                false      false        true
2                true       false        true
3                true       true         true
4                false      false        false

我遇到了什么问题?
我的应用程序中有一个 IsSicked、IsRetired 和 IsHoliday 复选框,允许用户检查多项选择并提交。
系统将根据用户的选择从数据库中返回员工列表。例如,当用户勾选 IsSicked 和 IsRetired 时,系统将从数据库中返回生病和退休的用户列表。

根据下面的代码,我需要写 2^3 = 8 种可能性才能得到结果。 由于该列扩展到 n 列(不包括 employeeID 列),我将需要编写 2^n if else 语句来获取查询。 如果有10列(10个复选框选择),那么我需要写2^10 = 1024 if else语句

在我看来,这应该是开发人员面临的一个相当普遍的问题,不幸的是我在网上找不到一个好的解决方案

解决方案的期望
C# 代码和/或 LINQ 查询的通用组合,无需硬编码如下逻辑 if(...) else if (...)

var employee = db.Employee.AsQueryable():
if(model.IsSicked == true)
{
    employee.Where(z => z.IsSicked == true)
}
else if(model.IsRetired == true)
{
    employee.Where(z => z.IsRetired == true)
}
...
...

else if(model.IsSicked == true && model.IsRetired == true)
{
    employee.Where(z => z.IsSick == true || z.IsRetired == true)
}
else if (model.IsSicked == true && model.IsRetired == true && model.IsHoliday == true)
{
    employee.Where(z => z.IsSick == true || z.IsRetired == true || z.IsHoliday == true)
}

最佳答案

为什么不将枚举[Flags]一起使用:

[Flags]
public enum EmployeeStatus
{
    None = 0,
    Sick = 1,
    Retired = 2,
    Holiday = 4
}

在您的数据库中,您可以将其存储为整数。

您的模型变得类似于

public class Employee
{
    public int Id { get; set; }
    public EmployeeStatus Status { get; set }
}

然后 LINQ 查询变得类似于:

employee.Where(z => z.Status == EmployeeStatus.Sick)

由于使用[Flags],您可以对多个状态执行以下操作,例如生病和退休:

employee.Where(z => z.Status == (EmpoyeeStatus.Sick | EmployeeStatus.Retired))

请注意,| 是 bool OR,翻译如下:

  EmpoyeeStatus.Sick | EmployeeStatus.Retired
= 1 | 2
= b01 | b10
= b11
= 3

在我们的逻辑中非常有效地充当“和”。

关于c# - 使用 Linq 的多个复选框选择结果,无需硬编码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28542684/

相关文章:

c# - 将最后创建的 ID 从操作传递到局部 View (asp.net mvc)

javascript - 在MVC中打开一个新的窗口表单操作方法

c# - LINQ:确定两个序列是否包含完全相同的元素

c# - Expression.Equal - 如何比较可空字段和不可空字段?

c# - 以编程方式确定项目解决方案中的索引 - C#

c# - 有没有办法合并两个 IObservables,这样如果 B 在 A 之前完成,它会停止结果(但反之亦然)?

c# - 如何创建动态数据库连接字符串C#

c# - 使用 Html.Beginform 助手时如何删除表单 html 标签中的 ID 部分?

c# - 为什么我的对象被处置?

c# - 访问其他 Windows 窗体类中的变量