Почему EF выполняет агрегацию локально? - PullRequest
0 голосов
/ 10 октября 2019

Я работаю с набором данных о погоде, поэтому в СУБД (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 не может передать агрегацию в СУБД?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...