具有多个搜索条件的笨重的LINQ语句

时间:2014-12-03 22:37:57

标签: c# linq

我有一个包含多个搜索条件的表单,用户可以用它来搜索员工数据,例如FirstName,LastName,HireDate,Department等。

我正在使用LINQ,并且想知道在给定任何搜索条件的情况下我可以使用什么方法来查询Employes集合,即用户不必输入所有,但是他们必须至少输入一个搜索参数。

到目前为止,在测试我的LINQ语句时,有两个搜索参数,似乎我必须查看是否输入了搜索参数。 如果是这种情况,那么对于许多搜索参数来说这可能变得非常笨重。

// only FirstName is entered
if (!string.IsNullOrEmpty(FirstName) && string.IsNullOrEmpty(LastName))
{
    var employees = DB.Employees
        .Where(emp => emp.FirstName.Contains(fName));
}
// only LastName is entered
else if (string.IsNullOrEmpty(FirstName) && !string.IsNullOrEmpty(LastName))
{
    var employees = DB.Employees
        .Where(emp => emp.LastName.Contains(lName));
}
// both parameters are entered
else if (!string.IsNullOrEmpty(FirstName) && !string.IsNullOrEmpty(LastName))
{
    var employees = DB.Employees
        .Where(emp => emp.FirstName.Contains(fName))
        .Where(emp => emp.LastName.Contains(lName));
}

仅供参考,我最初认为我可以使用相关的搜索参数将Where()语句附加到我的LINQ语句中,但我注意到并非所有记录都应该返回,因此if-then语句的上述逻辑。 / p>

4 个答案:

答案 0 :(得分:7)

这样的事情:

IQueryable<Employee> employees = DB.Employees;

if (!string.IsNullOrEmpty(FirstName))
{
    employees = employees 
        .Where(emp => emp.FirstName.Contains(fName));
}
if (!string.IsNullOrEmpty(LastName))
{
    employees = employees 
        .Where(emp => emp.Last.Contains(lName));
}

答案 1 :(得分:4)

你可以这样写:

var employees = DB.Employees.AsQueryable();
if (!string.IsNullOrEmpty(fName)
  employees = employees.Where(emp => emp.FirstName.Contains(fName));

if (!string.IsNullOrEmpty(lName)
  employees = employees.Where(emp => emp.LastName.Contains(lName));

答案 2 :(得分:1)

我遇到了类似的挑战,用户可以为大约10个可搜索字段选择0,1或多个值,并且需要在运行时构造该查询。

我最终使用LINQKit: http://www.albahari.com/nutshell/linqkit.aspx

特别是我使用了它的谓词构建器,这里描述: http://www.albahari.com/nutshell/predicatebuilder.aspx

在上面的示例中,您在if语句中包含了多个查询。 另一种方法是随时构建查询。

如果你要在那些if语句之外声明var employees = DB.Employees(假设它总是相关的),那么你可以在你的if语句中使用if语句来解决它们的问题。适用。

LINQ为您提供延迟执行,因此您不必将整个表达式放在一个块中(即使这样做最自然,在很多情况下也是如此)。

如果你想在OR中混合使用OR,事情就会变得复杂一些,但前面提到的谓词构建器会出现这种情况。

不幸的是,我没有任何例子可以分享,但这些链接应该让你有一个良好的开端。

答案 3 :(得分:0)

 var resultData = (from data in db.Abc
                   where !string.IsNullOrEmpty(firstName) ? data.FirstName == firstName : true
&& data.UserType == userTypeValue
&& !string.IsNullOrEmpty(lastName) ? data.LastName == lastName : true
&& !string.IsNullOrEmpty(gender) ? data.Gender == gender : true
&& !string.IsNullOrEmpty(phone) ? data.CellPhone == phone : true
&& !string.IsNullOrEmpty(fax) ? data.Fax == fax : true
&& !string.IsNullOrEmpty(emailAddress) ? data.Email == emailAddress : true
&& !string.IsNullOrEmpty(address1) ? data.Address == address1 : true
                              select new
                              {
                                  UserName = data.UserName,
                                  FirstName = data.FirstName,
                                  Address = data.Address,
                                  CellPhone = data.CellPhone,
                                  Fax = data.Fax,
                                  Email = data.Email
                              }).ToList();