我有几个C#业务类如下:
public class Employee
{
public int Id { get; set; }
public string Name { get; set; }
public string DepartmentCode { get; set; }
public string HireDate { get; set; }
public DateTime DateOfBirth { get; set; }
public DateTime Gender { get; set; }
}
public class EmployeeManagement
{
public List<Employee> GetEmployees(FilterExpression criteria)
{
throw new System.NotImplementedException();
}
}
目标是通过传递各种过滤条件来获取员工列表,例如所有属于特定部门的员工,或在特定日期之后雇用的员工或所有女性员工或标准的组合(涉及AND或OR条件)。我不希望为每个过滤条件实现许多重载方法,因为最终用户正在定义过滤条件,我不能假设所有可能的情况。
请帮助我设计一下我可以传递给GetEmployees方法的“FilterExpression”类?任何其他替代方法建议都会受到欢迎。
感谢。
更多详细信息:员工数据存储在数据库表中。我不想引入List<Employee>
中的所有员工,然后过滤数据。我的目标是从过滤器表达式生成SQL“where子句”,以便从数据库本身获取过滤后的Employee数据集。我正在努力解决上面提到的FilterExpression类的类设计。
答案 0 :(得分:2)
您必须告诉我们要将哪种表达式/过滤器传递给该方法。否则我会给出一个骗子答案:
public List<Employee> GetEmployees(Expression<Func<Employee,bool>> predicate)
{
return AllEmployees.Where(predicate.Compile()).ToList();
}
你可以使用:
var bob = GetEmployees(emp=>emp.Name.Equals("Bob")).FirstOrDefault;
var ITStaff = GetEmployees(emp=>emp.DepartmentCode.Equals("IT"));
答案 1 :(得分:0)
为什么不使用Expression<Func<Employee,bool>>
呢?虽然它通常与LINQ相关,但它并非必须如此。您可以传递lambda并在运行时检查表达式树。
var employees = GetEmployees(x => x.HireDate > DateTime.Today.AddDays(-7))