【发布时间】:2019-09-05 13:50:36
【问题描述】:
我正在使用 Entity Framework Core 2.2.6 对 Sql Server 数据库运行一个简单查询,但是 GroupBy 并未在服务器上执行,而是在本地执行。
有什么我遗漏的东西会迫使该组进入服务器吗?
我尝试过的 EF 查询的 2 种变体:
public class Holiday
{
public int Id {get;set;}
public DateTime Date {get;set;}
public string Username {get;set;}
public string Approver {get;set;}
}
//version 1
await _dbContext.Holidays
.GroupBy(h => new { h.Date})
.ToDictionaryAsync(x => x.Key.Date, x => x.Select(x1 => x1.Username).ToList());
//version 2
await _dbContext.Holidays
.GroupBy(h => h.Date)
.ToDictionaryAsync(x => x.Key, x => x.Select(x1 => x1.Username).ToList());
两种变体都会产生以下 SQL:
SELECT [h].[Id], [h].[Approver], [h].[Date], [h].[HolidayTypeId], [h].[OwningRequestId], [h].[HolidayStatusId], [h].[Username]
FROM [Holidays] AS [h]
ORDER BY [h].[Date]
警告产生:
警告:Microsoft.EntityFrameworkCore.Query[20500] 无法翻译 LINQ 表达式“GroupBy([h].Date, [h])”,将在本地进行计算。
来自cmets的建议:
//group by string
await _dbContext.Holidays
.GroupBy(h => h.Username)
.ToDictionaryAsync(x => x.Key, x => x.Select(x1 => x1.Username).ToList());
//group by part of date
await _dbContext.Holidays
.GroupBy(h => h.Date.Year)
.ToDictionaryAsync(x => x.Key, x => x.Select(x1 => x1.Username).ToList());
--group by string
SELECT [h].[Id], [h].[Approver], [h].[Date], [h].[HolidayTypeId], [h].[OwningRequestId], [h].[HolidayStatusId], [h].[Username]
FROM [Holidays] AS [h]
ORDER BY [h].[Username]
--group by part of date
SELECT [h].[Id], [h].[Approver], [h].[Date], [h].[HolidayTypeId], [h].[OwningRequestId], [h].[HolidayStatusId], [h].[Username]
FROM [Holidays] AS [h]
ORDER BY DATEPART(year, [h].[Date])
【问题讨论】:
-
如果有,请显示 Holiday 类和映射
-
如果我错了,有人可以纠正我,但我认为EF在后端生成SQL查询时不支持
GroupBy。 -
@Dortimer 从 Ef core 2.1 开始支持:docs.microsoft.com/en-us/ef/core/what-is-new/…
-
@miechoy 添加了假期班
-
@cmpbedes 这仍然只是一个猜测,但它如何处理除日期之外的分组?有时
.Net类型和SQL类型不能很好地配合,这可能是因为无法根据数据库中的数据类型评估DateTime。
标签: c# ef-core-2.2