2014-12-03 80 views
6

我有一个用户可以用来搜索员工数据的多种搜索条件的表单,例如,名字,姓氏,雇用日期,部门等具有多种搜索条件的笨拙的LINQ语句

我正在使用LINQ和我想知道什么方法可以用来查询给定的任何搜索条件的雇佣集合,即用户不必输入全部,但他们必须输入至少一个搜索参数。

到目前为止,当用两个搜索参数测试我的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)); 
} 

仅供参考,我最初以为我可以只添加其中()语句来我与相关的搜索参数LINQ语句,但我注意到,没有被返回的所有记录应,因此如果 - 上述逻辑然后声明。

+0

如果您使用的是IQueryable,则可以追加多个LINQ语句。这是LINQ到对象,还是你使用ORM来查询数据库? – cost 2014-12-03 22:42:42

+0

@成本 - 起初,我不明白你的建议,但看到提供的答案后,我相信你是正确的。谢谢! – 2014-12-03 22:50:21

回答

6

什么是这样的:

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

啊!如果我理解你的逻辑,每当它通过“if”语句时,原始的IQueryable员工都会继续附加更多.Where()语句,是否正确? – 2014-12-03 22:49:18

+0

@frenu和'IQueryable'就像一个未评估的LINQ语句。在迭代查询之前(比如'.ToList()'),查询本身将不会执行。因此,您继续构建Where子句,然后在最终尝试提取数据时对它们进行评估和执行。 – cost 2014-12-03 23:01:08

+0

@cost:感谢您的解释! – 2014-12-04 03:16:56

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

您是否需要将'employees'明确地声明为'IQueryable'? – cost 2014-12-03 22:44:11

+0

@成本,是的很对,谢谢。 – Magnus 2014-12-03 22:46:56

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语句中加入你的where语句(如果它们适用的话)。

LINQ给你延迟执行,所以你不必在一个块中有整个表达式(尽管这样做很自然,在很多情况下你会这样做)。

事情得到,如果你想在OR与AND运算混合有点复杂,但是这也正是前面提到的谓词建设者的用武之地。

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

+0

我实际上有5.0 Albahari书,并且是LINQPad的客户。我甚至没有想过LINQKit,但我现在正在考虑的东西。谢谢! – 2014-12-04 03:20:54

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

您可以使用此代码,如果您想根据多个搜索条件搜索项目 – 2016-03-16 10:50:42

+0

嗨Ramu感谢您的贡献。如果您添加指针和注释来解释为什么此代码可以解决此问题,那将会更好。 – NSNoob 2016-03-16 11:07:09