Chaining Linq Where子句

时间:2015-09-30 09:57:34

标签: c# linq linq-to-objects

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

我们有List<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

有更好的解决方法吗?

2 个答案:

答案 0 :(得分:6)

我会将这些全部捆绑到一个Where语句中并更新inTheirTwenties方法,以便像这样接受个人:

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

答案 1 :(得分:2)

链接使用.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查询,这种类型的代码还可以通过创建一个优雅的WHERE子句来简化数据库的内容,而不会在truefalse之间发送线。当然,您将无法使用inTheirTwenties(Person)访问SQL Server,而是会执行以下操作:

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