链接 Linq Where 子句

Chaining Linq Where clauses

你会如何根据不同的变量状态在 linq 中链接“Where”子句。 E,g;年龄范围复选框(21-30、31-40、41-50、51-60、60 >)

我们有一个 List<People> ‘People’,我们需要根据选中的框对其进行过滤。假设列表不能只是一个 IEnumerable,因为它已被评估

除了这样做:

List<People> filteredPeople = new List<people>();
if(CB1.checked)
    filteredPeople = filteredPeople.Union(People.Where(inTheirTwenties))  //assuming method  inTheir20s filters correct  
if(CB2.checked)
    filteredPeople = filteredPeople.Union(People.Where(inTheirThirties)) ;
//...and so on

有没有更好的解决方法?

我会将这一切打包成一个 Where 语句并更新 inTheirTwenties 方法以像这样获取个人:

filteredPeople.Where(x => (CB1.checked && inTheirTwenties(x)) 
|| (CB2.checked && inTheirThirties(x)) ...);

链接未知数量的 .Where() 个使用 OR 的子句会导致代码冗长且难以阅读。幸运的是,在您的场景中,您可以将其转换为一系列 AND 表达式,从而呈现出更具可读性的代码批次。

var filteredPeople = new List<Person>();

if(!checkBox1) filteredPeople = filteredPeople.Where(p => !inTheirTwenties(p));
if(!checkBox2) filteredPeople = filteredPeople.Where(p => !inTheirThirties(p));

如果这是一个 LINQ-to-SQL 查询,这种类型的代码还可以通过创建一个没有多个 true 和 [=16] 的优雅 WHERE 子句来简化对数据库的访问=] 通过网络发送。当然,您不能使用 inTheirTwenties(Person) 访问 SQL 服务器,而是可以执行以下操作:

filteredPeople.Where(p => !(p.Age >= 21 && p.Age <=30));