Linq EFCore 2.2按总和和日期差异分组
我正在尝试将下面的SQL转换为EF核心查询,并且收到了GroupBy和Sum将在本地计算的警告。目前是否有编写此文件的方法将其完全转换为SQLLinq EFCore 2.2按总和和日期差异分组,linq,group-by,linq-to-entities,datediff,ef-core-2.2,Linq,Group By,Linq To Entities,Datediff,Ef Core 2.2,我正在尝试将下面的SQL转换为EF核心查询,并且收到了GroupBy和Sum将在本地计算的警告。目前是否有编写此文件的方法将其完全转换为SQL SELECT UserId, ST.StatusId, SUM(DATEDIFF(MINUTE, StartDate, ISNULL(EndDate,GETDATE()))) AS Time FROM StatusTransaction ST WHERE TeamManagerId = 1 AND StartDate >= N'01
SELECT UserId, ST.StatusId, SUM(DATEDIFF(MINUTE, StartDate, ISNULL(EndDate,GETDATE()))) AS Time
FROM StatusTransaction ST
WHERE
TeamManagerId = 1
AND StartDate >= N'01-01-2019'
AND ISNULL(EndDate,GETDATE()) <= N'01-02-2019'
GROUP BY UserId, ST.StatusId
ORDER BY UserId
选择UserId、ST.StatusId、SUM(DATEDIFF(MINUTE、StartDate、ISNULL(EndDate、GETDATE())作为时间
来自statusst事务
哪里
TeamManagerId=1
开始日期>=N'01-01-2019'
首先,EF核心仍然不支持转换TimeSpan
操作,并且DateTime
差异产生TimeSpan
,因此EF.Functions.DateDiff
方法是正确的选择
其次,它仍然只能在简单的成员访问器表达式上转换GroupBy
聚合。因此,您必须在之前选择GroupBy
表达式:
var query = context
.Where(st => st.TeamManagerId == tmId
&& st.StartDate >= dateFrom
&& (st.EndDate ?? DateTime.Now) <= dateTo
)
.Select(st => new
{
st.UserId,
st.StatusId,
Time = EF.Functions.DateDiffMinute(st.StartDate, st.EndDate ?? DateTime.Now)
})
.GroupBy(st => new { st.UserId, st.StatusId })
.Select(g => new
{
g.Key.UserId,
g.Key.StatusId,
Time = g.Sum(st => st.Time)
});
var query = context
.Where(st => st.TeamManagerId == tmId
&& st.StartDate >= dateFrom
&& (st.EndDate ?? DateTime.Now) <= dateTo
)
.Select(st => new
{
st.UserId,
st.StatusId,
Time = EF.Functions.DateDiffMinute(st.StartDate, st.EndDate ?? DateTime.Now)
})
.GroupBy(st => new { st.UserId, st.StatusId })
.Select(g => new
{
g.Key.UserId,
g.Key.StatusId,
Time = g.Sum(st => st.Time)
});
var query = context
.Where(st => st.TeamManagerId == tmId
&& st.StartDate >= dateFrom
&& (st.EndDate ?? DateTime.Now) <= dateTo
)
.GroupBy(st => new { st.UserId, st.StatusId }, st => new
{
Time = EF.Functions.DateDiffMinute(st.StartDate, st.EndDate ?? DateTime.Now)
})
.Select(g => new
{
g.Key.UserId,
g.Key.StatusId,
Time = g.Sum(st => st.Time)
});