11

我有一个场景,我必须在 LINQ 中使用动态 where 条件。

我想要这样的东西:

public void test(bool flag)
{
   from e in employee
   where e.Field<string>("EmployeeName") == "Jhom"
   If (flag == true)
   {
       e.Field<string>("EmployeeDepartment") == "IT"
   }
   select e.Field<string>("EmployeeID")
}

我知道我们不能在 Linq 查询中间使用“If”,但解决方案是什么?

请帮忙...

4

5 回答 5

11

请查看完整的博文:使用 Linq 进行动态查询

您可以使用两个选项:

动态 LINQ 库

string condition = string.Empty;
if (!string.IsNullOrEmpty(txtName.Text))
    condition = string.Format("Name.StartsWith(\"{0}\")", txtName.Text);

EmployeeDataContext edb = new EmployeeDataContext();
if(condition != string.empty)
{
  var emp = edb.Employees.Where(condition);
 ///do the task you wnat
}
else
{
 //do the task you want 
}

谓词生成器

谓词生成器的工作方式类似于动态 LINQ 库,但它是类型安全的:

var predicate = PredicateBuilder.True<Employee>();

if(!string.IsNullOrEmpty(txtAddress.Text))
    predicate = predicate.And(e1 => e1.Address.Contains(txtAddress.Text));

EmployeeDataContext edb= new EmployeeDataContext();
var emp = edb.Employees.Where(predicate);

上述库之间的区别:

  • PredicateBuilder 允许构建类型安全的动态查询
  • 动态 LINQ 库允许使用字符串指定的动态 Where 和 OrderBy 子句构建查询。
于 2011-04-15T09:14:22.683 回答
9

所以,如果flagfalse你需要所有的 Jhoms,如果flag是真的你只需要 IT 部门的 Jhoms

这个条件

!flag || (e.Field<string>("EmployeeDepartment") == "IT"

满足该标准(如果标志为假等,则始终为真),因此查询将变为:

from e in employee    
where e.Field<string>("EmployeeName") == "Jhom"
  && (!flag || (e.Field<string>("EmployeeDepartment") == "IT")
select e.Field<string>("EmployeeID") 

另外,这个e.Field<string>("EmployeeID")业务,闻起来像软编码,可能会考虑一下。我猜

from e in employee    
where e.EmployeeName == "Jhom"
  && (!flag || (e.EmployeeDepartment == "IT")
select e.EmployeeID

会更紧凑,更不容易出现打字错误。


编辑:这个答案适用于这个特定的场景。如果您有很多此类查询,请务必使用其他答案中提出的模式。

于 2011-04-15T09:16:23.510 回答
2

您可以链接方法:

public void test(bool flag)
{
   var res = employee.Where( x => x.EmployeeName = "Jhom" );

   if (flag)
   {
       res = res.Where( x => x.EmployeeDepartment == "IT")
   }

   var id = res.Select(x => x.EmployeeID );
}
于 2011-04-15T09:15:35.603 回答
0
from e in employee    
where e.Field<string>("EmployeeName") == "Jhom" &&
(!flag || e.Field<string>("EmployeeDepartment") == "IT")
select e.Field<string>("EmployeeID") 
于 2011-04-15T09:16:41.170 回答
0

您可以显式调用 LINQ 方法并有条件地链接它们。

public IEnumerable<string> FilterEmployees (IEnumerable<Employee> source, bool restrictDepartment)
{
    var query = source.Where (e => e.Field<string>("EmployeeName") == "Jhom");

    if (restrictDepartment) // btw, there's no need for "== true"
        query = query.Where (e => e.Field<string>("EmployeeDepartment") == "IT");

    return query.Select (e => e.Field<string>("EmployeeID"));
}
于 2011-04-15T09:34:07.833 回答