首页 > 解决方案 > 为什么 EF 在本地运行聚合?

问题描述

我正在使用天气数据集,因此 DBMS (MSSQL) 中有很多数据。我想获取过去 2 小时内特定传感器的最新记录。

DB中的数据可以简化为:

| 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 在客户端进行聚合,但我更喜欢在 DBMS 中进行聚合,因为我相信客户端聚合需要更多时间。这就是我在控制台中可以看到的:

警告:Microsoft.EntityFrameworkCore.Query[20500] LINQ 表达式 'GroupBy([airData].SensorId, [airData])' 无法翻译,将在本地进行评估。警告:Microsoft.EntityFrameworkCore.Query[20500] 无法翻译 LINQ 表达式“orderby [y].Date desc”,将在本地进行评估。警告:Microsoft.EntityFrameworkCore.Query[20500] 无法翻译 LINQ 表达式“First()”并将在本地进行评估。

为什么 EF 不能将聚合传递给 DBMS?

标签: c#entity-frameworklinq

解决方案


推荐阅读