Во-первых, EF Core по-прежнему не поддерживает перевод TimeSpan
операций, а разница DateTime
приводит к TimeSpan
, следовательно, EF.Functions.DateDiff
методы - верный путь.
Во-вторых, он по-прежнемуможет перевести GroupBy
агрегаты только на простые выражения доступа к элементу.Таким образом, вы должны либо предварительно Select
выражения 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)
});
, либо использовать перегрузку GroupBy
, которая позволяет предварительно выбрать источник для агрегатов:
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)
});