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

  • 相关阅读:
    23种设计模式之单例模式
    6大设计原则之里氏替换原则
    6大设计原则之依赖倒置原则
    6大设计原则之接口隔离原则
    6大设计原则之迪米特法则
    Java日志第14天 2020.7.19
    Java日志第15天 2020.7.20
    Java日志第13天 2020.7.18
    Python 语音识别字幕生成器
    python list,tuple,str有序问题
  • 原文地址:https://www.cnblogs.com/jiangyunfeng/p/11845911.html
Copyright © 2011-2022 走看看