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的。

 

转载于:https://www.cnblogs.com/AaronAndJoe/p/4642231.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值