Linq 中 Any与All

昨天突然看到之前写的一个积累文档,其中文档中有一个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,我们就知道原因了

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      ENDAS [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      ENDAS [value]

 

可以看出   Any生成的是Exists。  当Query为空的时候,Exists是为false的。

 

posted @ 2015-07-13 10:31  玩的  阅读(1141)  评论(0编辑  收藏  举报