本篇讲解的内容有:
【1.使用where筛选过滤LINQ查询】
通常一个LINQ查询不会如前面的示例代码这么简单,经常还需要对数据源中的元素进行过滤。只有符合条件的元素,才能参与查询结果的计算。
在LINQ中,用where子句指定查询的过滤条件,它的格式如下:
1 where expression
其中,expression是一个逻辑表达式,返回布尔值“真”或“假”。
当被查询的元素参与表达式运算返回结果为“真”时,该元素参与查询结果运算。
【2.带条件的where筛选】
where子句中的条件表达式,可以用&&||指定多个条件的逻辑运算关系。其中,&&表示逻辑并,||表示逻辑或。他们的计算关系如下表:
exp1 | exp2 | exp1&&exp2 | exp1||exp2 |
真 | 真 | 真 | 真 |
真 | 假 | 假 | 真 |
假 | 真 | 假 | 真 |
假 | 假 | 假 | 假 |
如下列代码:
- 查询query1采用最简单的where子句条件,查询数组nums中所有大于15的元素。
- 查询query2在where子句的条件中使用&&运算,查询数组nums中大于10且小于40的元素。
- 查询query3在where子句的条件中使用||运算,查询数组nums中小于10或大于40的元素。
1 static void Main(string[] args) 2 { 3 int[] nums = { 1, 3, 9, 54, 20, 10, 23, 12, 18, 60, 37 }; // 创建int数组nums作为数据源 4 // 查询query1返回nums中所有大于15的元素 5 var query1 = 6 ( 7 from numItem in nums 8 where numItem > 15 9 select numItem 10 ); 11 // 打印query1的数据 12 foreach (var item in query1) 13 { 14 Console.Write("{0}, ", item); 15 } 16 Console.WriteLine(); 17 18 // 查询query2返回nums中所有大于10且小于40的元素,演示&&的使用 19 var query2 = 20 ( 21 from numItem in nums 22 where (numItem > 10) && (numItem < 40) 23 select numItem 24 ); 25 // 打印query2中的数据 26 foreach (var item in query2) 27 { 28 Console.Write("{0}, ", item); 29 } 30 Console.WriteLine(); 31 32 // 查询query3返回nums中所有小于0或大于40的元素,演示||的使用 33 var query3 = 34 ( 35 from numItem in nums 36 where (numItem < 10) || (numItem > 40) 37 select numItem 38 ); 39 // 打印query3中的元素 40 foreach (var item in query3) 41 { 42 Console.Write("{0}, ", item); 43 } 44 Console.WriteLine(); 45 }
运行结果如下:
【3.多个where筛选子句】
另外,在同一个LINQ查询中,还可以使用多个并列的where子句来进行多个条件过滤。数据源中的元素只有同时满足所有where子句的条件才能作为查询结果。
这样,可以将上面的代码中,query2等价写成下面query4的形式:
1 // 查询query4返回nums中所有大于10且小于40的元素,演示多个where子句的使用 2 var query4 = 3 ( 4 from numItem in nums 5 where numItem > 10 6 where numItem < 40 7 select numItem 8 );
上面的代码,只有同时满足两个where子句中的条件,才会作为查询结果。
技巧:where子句中的条件尽量简短易懂,并且还可以通过函数等方法来提供判断条件,当出现多个逻辑并(&&运算)的条件是,可以考虑使用多个并列的where子句代替。
内容参考:
《精通C#5.0与.NET 4.5高级编程——LINQ、WCF、WPF和WF》