linq子查询等同于内部查询中的Max Date

时间:2018-06-05 19:12:24

标签: sql-server entity-framework linq entity-framework-6 correlated-subquery

我有一个如下表格结构。


    CREATE TABLE [dbo].[SubscriptionMessageCount](
        [SubscriptionMessageCountId] [int] IDENTITY(1,1) NOT NULL,
        [ActiveMessageCount] [bigint] NOT NULL,
        [DeadLetterMessageCount] [bigint] NOT NULL,
        [CreatedDate] [datetime] NOT NULL,
        [CreatedBy] [nvarchar](max) NULL,
        [SubscriptionId] [int] NOT NULL,
     CONSTRAINT [PK_dbo.SubscriptionMessageCount] PRIMARY KEY CLUSTERED 
    (
        [SubscriptionMessageCountId] ASC
    )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)
    )

我正在尝试查找每个subscriptionID的最新记录(这不是唯一的)。我可以通过跟踪SQL查询来实现这一点。


    select *
    from SubscriptionMessageCount MsgCounterOutter
    where MsgCounterOutter.createdDate = 
        ( select Max(MsgCounterInner.createdDate)
            from SubscriptionMessageCount MsgCounterInner
            where MsgCounterOutter.SubscriptionID = MsgCounterInner.SubscriptionID 
            group by MsgCounterInner.SubscriptionID )

我需要一个产生上述SQL语句或相同结果的linq查询。我尝试使用linqpad工具,并提出了下面的linq查询,它给了我类似的SQL语句和相同的结果。


    from MsgCntOuter in SubscriptionMessageCounts 
    where MsgCntOuter.CreatedDate == ( from MsgCntInner in SubscriptionMessageCounts
                                    where MsgCntOuter.SubscriptionId == MsgCntInner.SubscriptionId
                                    group MsgCntInner by MsgCntInner.SubscriptionId into g
                                    select g.Max(s=>s.CreatedDate)).First()
    select MsgCntOuter

它生成的SQL如下所示。


    SELECT [t0].[SubscriptionMessageCountId], [t0].[ActiveMessageCount], [t0].[DeadLetterMessageCount], [t0].[CreatedDate], [t0].[CreatedBy], [t0].[SubscriptionId]
    FROM [SubscriptionMessageCount] AS [t0]
    WHERE [t0].[CreatedDate] = ((
        SELECT TOP (1) [t2].[value]
        FROM (
            SELECT MAX([t1].[CreatedDate]) AS [value]
            FROM [SubscriptionMessageCount] AS [t1]
            WHERE [t0].[SubscriptionId] = [t1].[SubscriptionId]
            GROUP BY [t1].[SubscriptionId]
            ) AS [t2]
        ))

结果也匹配我的SQL语句结果。但是当我尝试在我的控制台应用程序中使用相同的linq查询时,它会生成不同的SQL语句,并且结果也不同。


    var latestdata = from MsgCntOuter in context.SubscriptionMessageCounts
                                 where MsgCntOuter.CreatedDate == (from MsgCntInner in context.SubscriptionMessageCounts
                                                                   where MsgCntOuter.SubscriptionId == MsgCntInner.SubscriptionId
                                                                   group MsgCntInner by MsgCntInner.SubscriptionId into g
                                                                   select g.Max(s => s.CreatedDate)).FirstOrDefault()

                                 select MsgCntOuter;

它生成的SQL如下所示。


    SELECT [Project4].[SubscriptionMessageCountId] AS [SubscriptionMessageCountId],
           [Project4].[ActiveMessageCount] AS [ActiveMessageCount],
           [Project4].[DeadLetterMessageCount] AS [DeadLetterMessageCount],
           [Project4].[CreatedDate] AS [CreatedDate],
           [Project4].[CreatedBy] AS [CreatedBy],
           [Project4].[SubscriptionId] AS [SubscriptionId]
    FROM
      (SELECT [Project2].[SubscriptionMessageCountId] AS [SubscriptionMessageCountId],
              [Project2].[ActiveMessageCount] AS [ActiveMessageCount],
              [Project2].[DeadLetterMessageCount] AS [DeadLetterMessageCount],
              [Project2].[CreatedDate] AS [CreatedDate],
              [Project2].[CreatedBy] AS [CreatedBy],
              [Project2].[SubscriptionId] AS [SubscriptionId],
              [Project2].[C1] AS [C1],

         (SELECT TOP (1) [GroupBy2].[A1] AS [C1]
          FROM
            (SELECT [Extent3].[SubscriptionId] AS [K1],
                    MAX([Extent3].[CreatedDate]) AS [A1]
             FROM [dbo].[SubscriptionMessageCount] AS [Extent3]
             WHERE [Project2].[SubscriptionId] = [Extent3].[SubscriptionId]
             GROUP BY [Extent3].[SubscriptionId]) AS [GroupBy2]) AS [C2]
       FROM
         (SELECT [Extent1].[SubscriptionMessageCountId] AS [SubscriptionMessageCountId],
                 [Extent1].[ActiveMessageCount] AS [ActiveMessageCount],
                 [Extent1].[DeadLetterMessageCount] AS [DeadLetterMessageCount],
                 [Extent1].[CreatedDate] AS [CreatedDate],
                 [Extent1].[CreatedBy] AS [CreatedBy],
                 [Extent1].[SubscriptionId] AS [SubscriptionId],

            (SELECT TOP (1) [GroupBy1].[A1] AS [C1]
             FROM
               (SELECT [Extent2].[SubscriptionId] AS [K1],
                       MAX([Extent2].[CreatedDate]) AS [A1]
                FROM [dbo].[SubscriptionMessageCount] AS [Extent2]
                WHERE [Extent1].[SubscriptionId] = [Extent2].[SubscriptionId]
                GROUP BY [Extent2].[SubscriptionId]) AS [GroupBy1]) AS [C1]
          FROM [dbo].[SubscriptionMessageCount] AS [Extent1]) AS [Project2]) AS [Project4]
    WHERE [Project4].[CreatedDate] = (CASE
                                          WHEN ([Project4].[C1] IS NULL) THEN convert(datetime2, '0001-01-01 00:00:00.0000000', 121)
                                          ELSE [Project4].[C2]
                                      END)

我正在使用Entity Framework 6和SQL azure进行上述使用。需要帮助写一个合适的linq查询,它可以给我正确的结果。我尝试在我的linq查询中使用“let”,但它也给了我相同的SQL和相同的错误结果。

0 个答案:

没有答案