C# 为什么EF在本地运行聚合?

C# 为什么EF在本地运行聚合?,c#,entity-framework,linq,C#,Entity Framework,Linq,我使用的是天气数据集,所以DBMS(MSSQL)中有很多数据。我想获取过去2小时内特定传感器的最新记录 数据库中的数据可以简化为: | Date(DateTime) | SensorId(int) | Value(Double) | | ------------------- | ------------- | ------------- | | 2019-10-09T23:00:00 | 1 | 15 | | 2019-10-10T00:

我使用的是天气数据集,所以DBMS(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=wait\u sharedDbCtx
.天气
其中(x=>postSensors.Contains(x.SensorId)和&x.Date>=twoHoursAgo)
.GroupBy(x=>x.SensorId)
.Select(x=>x.OrderByDescending(y=>y.Date).First())
.AsNoTracking()
.ToListAsync();
出于某种原因,EF在客户端进行聚合,但我更喜欢在DBMS中进行聚合,因为我认为客户端聚合需要更多的时间。这就是我在console中看到的:

警告: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?

哪个EF版本?EF 6.3.0、.NetCore 2.2什么是
postSensors
?你试过不用那个过滤器吗?另外,
First
在MS SQL上总是很棘手的,没有用于此的聚合函数。该错误将表明它是某种EF核心版本,而不是非非核心版本。在早期的EF Core中存在一些本地分组问题,我认为这些问题在3尝试用sql编写查询时得到了解决。您将看到,按照自己的方式做自己想做的事情并不是件小事。您应该在日期上使用聚合函数
Max
,而不是
Order。首先,它可能会起作用。