【发布时间】:2016-09-25 08:06:13
【问题描述】:
所以基本上我必须为 4 个不同的角色获得 4 个不同的员工列表。 List of Roles 是 List of Enum 如下:
public enum Roles {
[Description("Level 1")]
L1,
[Description("Level 2")]
L2,
[Description("Level 3")]
L3,
[Description("Level 4")]
L4
};
-
L1可以查看L1,L2,L3和L4 -
L2可以查看L2,L3和L4 -
L3可以查看L3和L4。 -
L4无权查看任何员工。
下面是我为获取员工编写的查询。
if (!Equals(Role, Enum.GetName(typeof(GlobalMethods.Roles), 3)))
{
var _role = (GlobalMethods.Roles)Enum.Parse(typeof(GlobalMethods.Roles), Role,true);
List<EmployeeViewModel> employees = new List<EmployeeViewModel>();
switch (_role)
{
case GlobalMethods.Roles.L1:
employees = context.tblEmployees.Where(x => x.EmpID != homeViewModel.UserViewModel.EmpID).ToList().Select(x => new EmployeeViewModel
{
EmpActive = x.EmpActive,
EmpDOB = x.EmpDOB,
EmpName = x.EmpName
}).ToList();
break;
case GlobalMethods.Roles.L2:
employees= context.tblEmployees.Where(x => x.EmpID != homeViewModel.UserViewModel.EmpID).ToList().Where(x=>x.EmpRole != Enum.GetName(typeof(GlobalMethods.Roles), 0)).Select(x => new EmployeeViewModel
{
EmpActive = x.EmpActive,
EmpDOB = x.EmpDOB,
EmpName = x.EmpName,
}).ToList();
break;
case GlobalMethods.Roles.L3:
employees = context.tblEmployees.Where(x => x.EmpID != homeViewModel.UserViewModel.EmpID).ToList().Where(x.EmpRole != Enum.GetName(typeof(GlobalMethods.Roles), 0) && x.EmpRole != Enum.GetName(typeof(GlobalMethods.Roles), 1)).Select(x => new EmployeeViewModel
{
EmpActive = x.EmpActive,
EmpDOB = x.EmpDOB,
EmpName = x.EmpName,
}).ToList();
break;
default: break;
}
}
所以在上面的代码中,我有相同的 LINQ 查询,但只有 where 条件不同。有什么方法可以准备一个动态的where 条件并一次性获取列表?
【问题讨论】:
-
通过创建
Expression tree(二进制表达式)并使用And将它们组合以确保最终结果是可行的 -
我认为,我过度理解了您的要求,建议基于表达式树的通用解决方案,但确实为整体解决方案提供了很好的灵活性