2013-09-28 75 views
1

我需要檢索的填充一個DTO類使用LINQ

public class TemperatureModel 
{ 
    public string SensorType { get; set; } 
    public double RoomTemperature { get; set; } 
    public DateTime Created { get; set; } 
} 

收集最新的室溫在數據庫中表示每個溫度傳感器。

我有一個Linq查詢,用於檢索寫入數據庫的最新室溫,用於每個溫度傳感器。

var latestTemperatureQuery = 
    from temperature in db.RoomTemperature 
    join sensor in db.Sensor on temperature.SensorId equals sensor.Id 
    group temperature by temperature.SensorId into groupedRoomTemperature 
    select groupedRoomTemperature.OrderByDescending(t => t.Created) 
    .FirstOrDefault(); 

我努力修改上面的查詢來填充TemperatureModel DTO/POCO類。我顯然必須執行JOIN操作以獲取從應用的數據庫表中相應的SensorType然後還要做一些像

select new TemperatureModel 
{ 
    SensorType = // Selected SensorType value. 
    RoomTemperature = // Selected RoomTemperature value. 
    Created = // Selected Created value. 
} 

,同時仍然只選擇寫入到數據庫中每一個溫度傳感器的最後溫度。有關如何修改此查詢以填充我的DTO/POCO類的任何想法?

回答

1

好的,我找到了解決方案,希望這有助於未來的人。我利用關鍵字來跟蹤寫入數據庫的最新室溫。通過這樣做,我可以執行所有連接,將結果選擇到我的DTO/POCO類中,然後通過按日期排序並使用。First()來選擇最新的結果。我將我的linq查詢更改爲

var latestTemperatureQuery = 
    from temperature in db.RoomTemperature 
    join sensor in db.Sensor on temperature.SensorId equals sensor.Id 
    join sensorType in db.SensorType on sensor.TypeId equals sensorType.Id 
    let temperatureModel = new TemperatureModel 
    { 
     SensorType = sensorType.Type, 
     RoomTemperature = temperature.Temperature, 
     Created = temperature.Created 
    } 
    group temperature by temperatureModel.SensorId into groupedTemperatureModel 
    select groupedTemperatureModel.OrderByDescending(t => t.Created) 
    .FirstOrDefault(); 
+0

您可以在查詢的select部分中執行投影並消除let。 – TGnat

+0

好的,但你如何確保你仍然只選擇最新的記錄?你如何消除讓,並仍然做一個grouppedTemperatureModel.OrderByDescending(t => t.Created) .FirstOrDefault(); – user65439