c# - 为什么 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?
解决方案
推荐阅读
- bash - 如何在模式替换的替换部分中转义反斜杠?
- surveyjs - SurveyJS 是否具有指定“每页显示 N 个问题”的内置方法
- react-native - nativebase选项卡动态选项卡闪烁
- r - 有没有办法使用 case_when 创建一个新变量,但只将条件值更改一个固定的倍数?
- c++ - 基类和派生类的 C++ 向量之间的转换
- sql - 如何在 SQL 中将列合并为一列?
- javascript - 如何使用 jQuery 滚动(元素底部应位于页面底部)
- python - 熊猫中的时间增量矩阵(成对)
- python - 如何防止循环重复我的随机值?
- sql - SQL Server中如何通过行比较计算一致性程度?