有选择地从LINQ表达式树中的where子句中删除

kok*_*kos 2 .net linq

从以下LINQ查询开始:

from a in things  
where a.Id == b.Id &&  
a.Name == b.Name &&  
a.Value1 == b.Value1 &&  
a.Value2 == b.Value2 &&  
a.Value3 == b.Value3  
select a;
Run Code Online (Sandbox Code Playgroud)

如何删除(在运行时)where子句中的一个或多个条件,以获取类似于以下的查询:

from a in things  
where a.Id == b.Id &&  
a.Name == b.Name &&  
a.Value2 == b.Value2 &&  
a.Value3 == b.Value3  
select a;
Run Code Online (Sandbox Code Playgroud)

要么

from a in things  
where 
a.Name == b.Name &&  
a.Value3 == b.Value3  
select a;
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 6

我不是试图改变现有的where子句,而是将其重构为:

from a in things  
where a.Id == b.Id 
where a.Name == b.Name 
where a.Value1 == b.Value1
where a.Value2 == b.Value2
where a.Value3 == b.Value3  
select a;
Run Code Online (Sandbox Code Playgroud)

然后变成:

things.Where(a => a.Id == b.Id)
      .Where(a => a.Name == b.Name)
      .Where(a => a.Value1 == b.Value1)
      .Where(a => a.Value2 == b.Value2)
      .Where(a => a.Value1 == b.Value3);
Run Code Online (Sandbox Code Playgroud)

现在应该相当清楚如何继续 - 将调用条件化为Where:

IQueryable<Whatever> query = things;
if (useId) {
    query = query.Where(a => a.Id == b.Id);
}
query = query.Where(a => a.Name == b.Name);
if (checkValue1) {
    query = query.Where(a => a.Value1 == b.Value1);
}
// etc
Run Code Online (Sandbox Code Playgroud)