zoukankan      html  css  js  c++  java
  • linq to sql any和all的区别

    Any
    说明:用于判断集合中是否有元素满足某一条件;不延迟。(若条件为空,则集合只要不为空就返回True,否则为False)。
    1.简单形式:
    仅返回没有订单的客户:
    var q =
    from c in db.Customers
    where !c.Orders.Any()
    select c;

    生成SQL语句为:
    SELECT [t0].[CustomerID], [t0].[CompanyName], [t0].[ContactName],
    [t0].[ContactTitle], [t0].[Address], [t0].[City], [t0].[Region],
    [t0].[PostalCode], [t0].[Country], [t0].[Phone], [t0].[Fax]
    FROM [dbo].[Customers] AS [t0]
    WHERE NOT (EXISTS(
    SELECT NULL AS [EMPTY] FROM [dbo].[Orders] AS [t1]
    WHERE [t1].[CustomerID] = [t0].[CustomerID]
    ))

    All
    说明:用于判断集合中所有元素是否都满足某一条件;不延迟
    var q =
    from c in db.Customers
    where c.Orders.All(o => o.ShipCity == c.City)
    select c;

    语句描述:这个例子返回所有订单都运往其所在城市的客户或未下订单的客户。

    ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

    昨天突然看到之前写的一个积累文档,其中文档中有一个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=="")

    -- Region Parameters
    DECLARE @p0 NVarChar(1000) = ''
    -- EndRegion
    SELECT
    (CASE
    WHEN NOT (EXISTS(
    SELECT NULL AS [EMPTY]
    FROM [Test] AS [t1]
    WHERE (
    (CASE
    WHEN [t1].[OpenId] = @p0 THEN 1
    ELSE 0
    END)) = 0
    )) THEN 1
    WHEN NOT NOT (EXISTS(
    SELECT NULL AS [EMPTY]
    FROM [Test] AS [t1]
    WHERE (
    (CASE
    WHEN [t1].[OpenId] = @p0 THEN 1
    ELSE 0
    END)) = 0
    )) THEN 0
    ELSE NULL
    END) AS [value]

    可以看得出来, All 是用的 Not (Exists) , 当Query为空的时候,Exists是为false的,而前面一个Not (false),当然也成为了True;

     Any:          IQueryable<Test>.Any(t=>t.OpenId=="")

    DECLARE @p0 NVarChar(1000) = ''
    -- EndRegion
    SELECT
    (CASE
    WHEN EXISTS(
    SELECT NULL AS [EMPTY]
    FROM [Test] AS [t0]
    WHERE [t0].[OpenId] = @p0
    ) THEN 1
    ELSE 0
    END) AS [value]

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

  • 相关阅读:
    一个编译器的实现0
    《穿越计算机的迷雾》笔记
    C#WinForm应用程序实现自动填充网页上的用户名和密码并点击登录按钮
    一个编译器的实现2——从文法到LL(1)分析表的概念和算法
    使用百度地图API的例子
    过桥问题 Bridge and torch problem
    (译)跟媳妇解释面向对象设计
    批量照片缩小器展示多线程控件BackgroundWorker后台工作使用方法
    图解:邮件(消息)的加密解密和数字签名
    一个编译器的实现1——开篇
  • 原文地址:https://www.cnblogs.com/jiangyunfeng/p/11845911.html
Copyright © 2011-2022 走看看