我有一个SQLite表,其中包含我们运行的每个测试结果,并且我希望编写一个实体框架查询,该查询仅返回每个项目的最新测试结果。
通常,我假设这将是“按项目ID分组,返回具有最大更新值的行”,或者“按日期排序并先返回”。但是,当我尝试查询时,我不断收到“无法翻译”实体框架错误。
这是我尝试过的:
results = await _context.Results .Include(x => x.Project) .AsNoTracking() .OrderByDescending(x => x.Updated) .GroupBy(x => x.ProjectId, (x, y) => y.First()) .ToListAsync();
但是,我不断收到错误消息,该.First()命令表明Entity Framework无法翻译该命令。是否有我所缺少的东西(或者替代地,一种更好的方式来编写对实体框架更友好的查询)?
.First()
我宁愿在服务器上做尽可能多的工作,因为项目数量很少,但是可能有成千上万的结果,如果可能的话,我宁愿不进行客户端过滤。
该应用程序是使用Entity Framework Core为ASP.NET Core 3.1编写的。
较小的编辑:在使用SQLite进行开发时,最终代码将针对SQL Server运行,因此需要在服务器端进行处理。
尝试使用子查询而不是分组。像这样:
results = await _context.Results .Include(x => x.Project) .AsNoTracking() .Where( r => r.Id == _context.Results.Where( rr => rr.ProjectId == r.ProjectID).Max( rr => rr.Id) ) .ToListAsync();