Я работаю с набором данных о погоде, поэтому в СУБД (MSSQL) много данных. Я хочу получить последние записи конкретных датчиков за последние 2 часа.
Данные в БД можно упростить до этого:
| Date(DateTime) | SensorId(int) | Value(Double) |
| ------------------- | ------------- | ------------- |
| 2019-10-09T23:00:00 | 1 | 15 |
| 2019-10-10T00:00:00 | 1 | 15 |
| 2019-10-10T00:00:00 | 2 | 3.5 |
| 2019-10-10T00:00:00 | 3 | 765 |
| 2019-10-10T01:11:11 | 1 | 10 |
| 2019-10-10T01:11:11 | 2 | 4 |
В качестве примера я хотел бы получить последние записи для датчиков 1 и 2, не старше 00:00:00,Ожидаемый результат запроса должен быть:
| Date(DateTime) | SensorId(int) | Value(Double) |
| ------------------- | ------------- | ------------- |
| 2019-10-10T01:11:11 | 1 | 10 |
| 2019-10-10T01:11:11 | 2 | 4 |
Вот мой запрос.
var latestData = await _sharedDbCtx
.Weather
.Where(x => postSensors.Contains(x.SensorId) && x.Date >= twoHoursAgo)
.GroupBy(x => x.SensorId)
.Select(x => x.OrderByDescending(y => y.Date).First())
.AsNoTracking()
.ToListAsync();
По какой-то причине EF выполняет агрегацию на стороне клиента, но я бы предпочел сделать это в СУБД, потому что я считаю, что агрегация на стороне клиента занимает больше времени. Вот что я вижу в консоли:
предупреждение: Microsoft.EntityFrameworkCore.Query [20500] Выражение LINQ 'GroupBy ([airData] .SensorId, [airData])' не может быть переведено и будетоцениваться на местном уровне. warn: Microsoft.EntityFrameworkCore.Query [20500] Выражение LINQ 'orderby [y] .Date desc' не может быть переведено и будет оценено локально. warn: Microsoft.EntityFrameworkCore.Query [20500] Выражение LINQ 'First ()' не может быть переведено и будет оценено локально.
Почему EF не может передать агрегацию в СУБД?