Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linq EFCore 2.2按总和和日期差异分组_Linq_Group By_Linq To Entities_Datediff_Ef Core 2.2 - Fatal编程技术网

Linq EFCore 2.2按总和和日期差异分组

Linq 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

我正在尝试将下面的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-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)
    });