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});

遅延実行では、両方のクエリが 1 つとして実行されます。

補足として、ロジックが正しくない可能性があることを指摘したいと思います。DevicesActivityData最新の日付を持つデバイスのリストが必要なようです。しかし、最大日付はもはやデバイスに関連していません。これは単なる任意の日付のリストです。そのため、デバイスDevicesActivityDataには、収集された日付のいずれかと一致する日付を持つより多くのレコードを含めることができます。DevicesActivityDataその特定のデバイスの最大日付のレコードを探す必要があると思います。

于 2012-10-23T08:37:01.057 に答える