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

本文关键字:LINQ 语句 条件 搜索 | 更新日期: 2023-09-27 18:33:05

我有一个具有多个搜索条件的表单,用户可以使用这些条件来搜索员工数据,例如名字,姓氏,雇用日期,部门等。

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

到目前为止,在使用两个搜索参数测试我的 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 语句的逻辑。

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

像这样的事情呢:

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));
}

你可以这样写:

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));

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

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

特别是我使用了它的谓词生成器,描述如下:http://www.albahari.com/nutshell/predicatebuilder.aspx

在上面的示例中,您已经包含了 if 语句中的查询倍数。另一种方法是随时生成查询。

如果要声明 var 员工 = DB。在这些 if 语句之外的员工(假设它总是相关的(,那么如果适用,您可以在 if 语句中附加您的 where 语句。

LINQ 为您提供了延迟执行,因此您不必将整个表达式放在单个块中(尽管这样做感觉最自然,而且在许多情况下您会这样做(。

如果你想将OR与AND混合在一起,事情会变得有点复杂,但这就是前面提到的谓词生成器的用武之地。

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

 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();