繁体   English   中英

Chaining Linq Where子句

[英]Chaining Linq Where clauses

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

我们有一个List<People> 'People',我们需要根据复选框过滤它。 假设List不能只是一个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)) ...);

链接使用OR的未知数量的.Where()子句可能导致冗长且难以阅读的代码。 幸运的是,在您的场景中,您可以将其反转为一系列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查询,这种类型的代码还可以通过创建一个优雅的WHERE子句来简化数据库中的内容,而不会通过线路发送多个truefalse 当然,您将无法使用inTheirTwenties(Person)来访问SQL Server,而是会执行以下操作:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM