所有参数都可以有“和”或“或”条件。- 您可以考虑使用 PredicateBuilder。请参阅http://www.albahari.com/nutshell/predicatebuilder.aspx。为什么?因为这允许您编写单个查询,但仅在需要时添加 AND/OR 谓词。您可能需要也可能不需要此功能,但要注意这是一个很好的功能。在实际调用查询之前没有数据库开销 - 它提供了一种有条件地构建 IQueryable 的方法,您可能不想在某些条件下匹配字段。例如,前几天我在输入字符串少于 10 个字符的搜索中使用它来忽略产品代码字段 - 最小长度为 10。
这将允许您使用 if 条件添加 AND/OR 语句,如下所示:
public IQueryable<Employee> FilterEmployees(IQueryable<Employee> query, DateTime startDate, DateTime endDate, string employeeName, EmployeeStatus employeeStatus)
{
var predicate = PredicateBuilder.True<Employee>();
//All names starting with 'A'
predicate = predicate.And(x => x.Name.StartsWith("A"));
//Add a condition only if the employee is PartTime
if (employeeStatus == EmployeeStatus.PartTime)
{
//Add condition for when they start
predicate = predicate.And(x => x.StartDate >= startDate);
}
else
{
//Say we don't care about the start date for the other employee statuses,
//but we want to add condition for when non-part-time employees are due to leave
predicate = predicate.And(x => x.EndDate <= endDate);
//or their name ends in 'z'
predicate = predicate.Or(x => x.Name.EndsWith("z"));
}
IQueryable<Employee> employees = query.FindBy(predicate); //you should probably use a repository here to return your query
return employees
}
注意 - 这旨在作为伪代码进行演示并且可能有错误 - 请参阅上面的链接以获取正确的实现。