c# - 使用 LINQ 进行过滤条件搜索

标签 c# linq

我是 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/

相关文章:

c# - C#错误CS0201 : Only assignment, call, increment, decrement, and new object expressions can be used as a statement

c# - 如何为表单中的每个 WebBrowser 控件设置不同的代理 - 所有可能的方法

c# - 如何创建包含前景色等属性的 Cha 信息数组?

c# - 使用 Linq 计算余弦和正弦

c# - 多对多 Entity Framework GetUsersInRole()

林克 |如何在不分组的情况下获得 SUM?

c# - 如何使用 Join 和 Where 返回 IList?

c# - 使用 ServiceStack 下载文件(html 内容)

c# - LINQ查询如何在开始和结束索引之间选择最大值以及最大值的索引

LINQ 选择行 "max"版本