昨天突然看到之前写的一个积累文档,其中文档中有一个Linq Any和All的注意事项:
注意Any 和 All
var list = new List<int>();
var aa = list.All(n => n > 1);
var bb = list.Any(n => n > 1);
// aa: true bb: false
其中List是一个元素个数为0的整型List。
可能大多数人跟我一样,第一次见到都会认为aa为false。
然后这个是我在程序中写Linq的时候,造成了很大困惑,明明条件是正确的(当时一直认为aa为false),却结果不对。
最后一句一句,一个条件一个条件的拆分了执行,才找到这个原因。
看看他生成的SQL,我们就知道原因了
看看他生成的SQL,我们就知道原因了
All: IQueryable<Test>.All(t=>t.OpenId=="")
1
-- Region
Parameters
2 DECLARE @p0 NVarChar( 1000) = ''
3 -- EndRegion
4 SELECT
5 ( CASE
6 WHEN NOT ( EXISTS(
7 SELECT NULL AS [ EMPTY ]
8 FROM [ Test ] AS [ t1 ]
9 WHERE (
10 ( CASE
11 WHEN [ t1 ]. [ OpenId ] = @p0 THEN 1
12 ELSE 0
13 END)) = 0
14 )) THEN 1
15 WHEN NOT NOT ( EXISTS(
16 SELECT NULL AS [ EMPTY ]
17 FROM [ Test ] AS [ t1 ]
18 WHERE (
19 ( CASE
20 WHEN [ t1 ]. [ OpenId ] = @p0 THEN 1
21 ELSE 0
22 END)) = 0
23 )) THEN 0
24 ELSE NULL
25 END) AS [ value ]
2 DECLARE @p0 NVarChar( 1000) = ''
3 -- EndRegion
4 SELECT
5 ( CASE
6 WHEN NOT ( EXISTS(
7 SELECT NULL AS [ EMPTY ]
8 FROM [ Test ] AS [ t1 ]
9 WHERE (
10 ( CASE
11 WHEN [ t1 ]. [ OpenId ] = @p0 THEN 1
12 ELSE 0
13 END)) = 0
14 )) THEN 1
15 WHEN NOT NOT ( EXISTS(
16 SELECT NULL AS [ EMPTY ]
17 FROM [ Test ] AS [ t1 ]
18 WHERE (
19 ( CASE
20 WHEN [ t1 ]. [ OpenId ] = @p0 THEN 1
21 ELSE 0
22 END)) = 0
23 )) THEN 0
24 ELSE NULL
25 END) AS [ value ]
可以看得出来, All 是用的 Not (Exists) , 当Query为空的时候,Exists是为false的,而前面一个Not (false),当然也成为了True;
Any: IQueryable<Test>.Any(t=>t.OpenId=="")
1 -- Region Parameters
2
DECLARE
@p0
NVarChar(
1000)
=
''
3 -- EndRegion
4 SELECT
5 ( CASE
6 WHEN EXISTS(
7 SELECT NULL AS [ EMPTY ]
8 FROM [Test ] AS [ t0 ]
9 WHERE [ t0 ]. [ OpenId ] = @p0
10 ) THEN 1
11 ELSE 0
12 END) AS [ value ]
3 -- EndRegion
4 SELECT
5 ( CASE
6 WHEN EXISTS(
7 SELECT NULL AS [ EMPTY ]
8 FROM [Test ] AS [ t0 ]
9 WHERE [ t0 ]. [ OpenId ] = @p0
10 ) THEN 1
11 ELSE 0
12 END) AS [ value ]
可以看出 Any生成的是Exists。 当Query为空的时候,Exists是为false的。