筛选条件搜索使用LINQ
我是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个这样的子查询,在所有这些子查询的最后,我必须将我的结果合并到一个员工列表中并返回,请记住,任何子查询结果可能为空
我相信这不是一个独特的问题,我看到类似的问题之前问,但不完全相同的问题。这样做是这样的所以如果他们决定在稍后添加更多搜索条件(比如说开始日期),那么我很容易维护。我希望能够轻松修改我的方法来处理该问题。
感谢一群寻找。
您可以继续在相同的结果上添加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();
}
错误的方法,如果你这样做的结果将包含dublicate条目,明显将是必要的! –
@DavitTvildiani这到底会如何重复?每个aditional的'。凡()'返回小于先前的滤波器不多 –
对不起,没有dublicates但你的过滤器是错误的,正确的做法是,在每次启动过滤整个集合,而不是从以前的查询查询过滤结果... 因为,如果“Klara”不是名字,并且姓氏中包含“bond”,那么您的过滤器将返回0,当它应该返回... –
为什么你总是把你的数据填充到一个列表中,然后立即抛出这个列表而不使用它?只需停止为添加的每个过滤器创建中间列表。 – Servy