Mam sobie w bazie danych tabele (obiekty) typu Sensor, które są powiązane relacją z obiektami SensorValue. I tych SensorValue może być dużo (obecnie dziesiątki tysięcy dla jednego Sensor). Żeby przedstawić użytkownikowi wiele rzeczy potrzebuję najczęściej tylko najnowszych (najświeższych) SensorValue, więc robienie czegoś w stylu context.Sensors.Include(x => x.Values).ToList()
chyba nie ma sensu.
I obecnie robię to sobie tak, że ręcznie buduję nową listę obiektów, na podstawie listy sensorów bez użycia Include() oraz na podstawie pobrania tylko ostatnich 50 (dobrane całkowicie arbitralnie) wartości z każdego z sensorów.
public IEnumerable<Sensor> GetAllSensorsWithValues()
{
var sensors = GetAllSensors();
var result = new List<Sensor>();
foreach (var item in sensors)
{
result.Add(GetSensorWithLast50Values(item.Name));
}
return result;
}
public IEnumerable<Sensor> GetAllSensors()
{
return _context.Sensors.ToList();
}
public Sensor GetSensorWithLast50Values(string name)
{
var sensor = _context.Sensors.First(x => x.Name == name);
sensor.Values = _context.SensorValues
.Where(x => x.Sensor == sensor)
.OrderByDescending(x => x.Timestamp)
.Take(50).ToList();
return sensor;
}
Główne pytanie: czy to można zrobić lepiej/ładniej/sensowniej?