2013-09-28 3 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. Очевидно, я должен выполнить РЕГИСТРИРУЙТЕСЬ операцию, чтобы получить соответствующую SensorType от соответствующей таблице базы данных, а затем сделать что-то вроде

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

пока еще только выбрать последний температуры записывается в базу данных для каждого датчика температуры. Любые идеи о том, как изменить этот запрос, чтобы заполнить мой класс DTO/POCO?

ответ

1

Хорошо, я нашел решение, надеюсь, что это поможет кому-то в будущем. Я использовал ключевое слово let, чтобы отслеживать последние температуры в помещении, которые были записаны в базу данных. Сделав это, я смог выполнить все мои соединения, выбрать результаты в свой класс 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

Вы можете сделать проецирование в выбранной части запроса и исключить let. – TGnat

+0

Хорошо, но как же вы затем убедитесь, что вы по-прежнему выбираете только последние записи? Как вы удаляете let и все еще делаете groupedTemperatureModel.OrderByDescending (t => t.Created) .FirstOrDefault(); – user65439

Смежные вопросы