2

我有以下 SQL 查询:

SELECT      Devices.*
        ,   DevicesActivityData.* 
FROM        Devices
INNER JOIN  DevicesActivityData 
        ON  Devices.ID = DevicesActivityData.DeviceID
WHERE       DevicesActivityData.DeviceDateTime IN (
                SELECT    MAX(DevicesActivityData.DeviceDateTime) AS MaxDate
                FROM      DevicesActivityData                                
                GROUP BY  DevicesActivityData.DeviceID
            )

我需要完成我的代码:

var Q = db.Devices.Join(
            db.DevicesActivityDatas, 
            d => d.ID, 
            a => a.DeviceID,
            (d, a) => new { d.ID,d.DeviceName,a.DeviceDateTime }
        );

我在最后一部分有问题选择最大值

如何将此部分添加到我的查询中......

[where DevicesActivityData.DeviceDateTime in ( select max(DevicesActivityData.DeviceDateTime) as MaxDate from DevicesActivityData group by DevicesActivityData.DeviceID )]
4

1 回答 1

0

首先创建选择最大日期的查询:

var maxDates = db.DevicesActivityDatas
           .GroupBy(d => d.DeviceID)
           .Select(g => g.Max(t => t.DeviceDateTime));

然后做:

 var Q = db.Devices.Join(db.DevicesActivityDatas
                          .Where(m => maxDates.Contains(m.DeviceDateTime)),
                            d => d.ID, a => a.DeviceID,
                           (d, a) => new { d.ID,d.DeviceName,a.DeviceDateTime});

延迟执行将使两个查询作为一个运行。

作为旁注,我想指出逻辑可能不正确。在我看来,您想要一个DevicesActivityData具有最新日期的设备列表。但是最大日期不再与设备相关,它只是任意日期的列表。因此,设备可以有更多DevicesActivityData记录,其日期与收集的日期之一相匹配。我认为您需要查找DevicesActivityData具有该特定设备最大日期的记录。

于 2012-10-23T08:37:01.057 回答