[英]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子句来简化数据库中的内容,而不会通过线路发送多个true
和false
。 当然,您将无法使用inTheirTwenties(Person)
来访问SQL Server,而是会执行以下操作:
filteredPeople.Where(p => !(p.Age >= 21 && p.Age <=30));
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.