我是 LINQ 查询的“新手”,我有另一个问题,但我不确定这是否是解决问题的最有效方法。在我的项目中,我在一个真实的数据库中工作,但为了简单起见,我将在这里将其压缩为一个简单的员工列表:
var employees = new List<Employee>
{
new Employee { Id = 0, firstName = "James", LastName = "Bond", Manager = "M", StartDate = DateTime.Now },
new Employee { Id = 1, firstName = "Eric", LastName = "Bond", Manager = "M", StartDate = DateTime.Now },
new Employee { Id = 2, firstName = "Sue", LastName = "Milton", Manager = "Q", StartDate = DateTime.Now },
new Employee { Id = 3, firstName = "Olivia", LastName = "Milton", Manager = "M", StartDate = DateTime.Now },
new Employee { Id = 4, firstName = "Alice", LastName = "Raymond", Manager = "M", StartDate = DateTime.Now },
new Employee { Id = 5, firstName = "James", LastName = "Skywalker", Manager = "M", StartDate = DateTime.Now },
new Employee { Id = 6, firstName = "Luke", LastName = "Skywalker", Manager = "M", StartDate = DateTime.Now },
};
我必须根据给定的条件在此列表中搜索.. 其中条件是各种字段与 OR 和 AND 操作的组合,例如在字段中获取所有员工,其中:
- firstName = "James"OR "eric"AND manager = "Q"
- lastname = "bond"OR "Martha"
- firstName = "James"AND Lastname = "Bond" 等等……
这将是一个网络 API 调用,我必须用一种方法来完成。另一个挑战是每个搜索参数都是“可选的”,即,他们可以向我传递一个名字列表和经理姓名,并忽略姓氏参数等。所以这是我开始编码的内容:
public IList<Employee> GetFilteredEmployees(IList<String> firstnames = null,
IList<String> lastnames = null,
IList<String> managers = null)
{
if (firstnames != null && firstnames.Any())
{
foreach (var fn in firstnames)
{
employeeByFn = employees.Where(emp => emp.firstName == fn).ToList<Employee>();
}
}
if (lastnames != null && lastnames.Any())
{
foreach (var ln in lastnames)
{
employeeByLn = employees.Where(emp => emp.LastName == ln).ToList<Employee>();
}
}
..... // code ellided
}
如您所见,即使有一些搜索条件参数,这也变得很难看。在我的真实项目中,我有多达 16 个。同样在所有这些子查询结束时,我必须将我的结果合并到一个员工列表中并返回,请记住任何子查询结果都可能为空。
我确信这不是一个独特的问题,我看到以前问过类似的问题,但不是完全相同的问题。执行此操作的优雅方式也易于维护。即如果他们决定稍后添加更多搜索条件(比如在开始日期之前),我希望能够轻松修改我的方法来处理它。
非常感谢您的浏览。
最佳答案
您可以继续在同一结果上添加 Where()
条件,而不是创建许多部分结果。
public IList<Employee> GetFilteredEmployees(IList<String> firstnames = null,
IList<String> lastnames = null,
IList<String> managers = null)
{
IQueryable<Employee> result = employees;
if (firstnames != null)
result = result.Where(emp => firstnames.Contains(emp.firstName));
if (lastnames != null)
result = result.Where(emp => lastnames.Contains(emp.LastName));
if (managers != null)
result = result.Where(emp => managers.Contains(emp.Manager));
... // code ellided
return result.ToList();
}
关于c# - 使用 LINQ 进行过滤条件搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35875250/