2016-03-08 92 views
4

我是LINQ查询的'新手'有另一个这样的问题,我有事情要做,但不知道这是否是最有效的方法。在我的项目,我在一个真正的DB工作,但是为了简单的缘故,在这里我会凝结下来给员工的一个简单的列表:筛选条件搜索使用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 =“詹姆斯” OR“埃里克” 经理=“Q “
  • lastname =”bond““玛莎”
  • 的firstName =“詹姆斯” 姓=“邦德” 等等...

这将是一个Web API调用,我必须这样做在一种方法中。另一个挑战是,每个搜索参数是“可选”,即他们可以通过我firstnames列表和经理的名字而忽略了姓氏参数等,所以这里是我开始编码:

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个这样的子查询,在所有这些子查询的最后,我必须将我的结果合并到一个员工列表中并返回,请记住,任何子查询结果可能为空

我相信这不是一个独特的问题,我看到类似的问题之前问,但不完全相同的问题。这样做是这样的所以如果他们决定在稍后添加更多搜索条件(比如说开始日期),那么我很容易维护。我希望能够轻松修改我的方法来处理该问题。

感谢一群寻找。

+1

为什么你总是把你的数据填充到一个列表中,然后立即抛出这个列表而不使用它?只需停止为添加的每个过滤器创建中间列表。 – Servy

回答

5

您可以继续在相同的结果上添加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(); 
} 
+0

错误的方法,如果你这样做的结果将包含dublicate条目,明显将是必要的! –

+1

@DavitTvildiani这到底会如何重复?每个aditional的'。凡()'返回小于先前的滤波器不多 –

+0

对不起,没有dublicates但你的过滤器是错误的,正确的做法是,在每次启动过滤整个集合,而不是从以前的查询查询过滤结果... 因为,如果“Klara”不是名字,并且姓氏中包含“bond”,那么您的过滤器将返回0,当它应该返回... –