C# SQL到实体框架-不存在计数&;GROUPBY in语句

C# SQL到实体框架-不存在计数&;GROUPBY in语句,c#,sql-server,entity-framework,C#,Sql Server,Entity Framework,对实体框架来说是全新的,但我正在扩展另一个开发人员的一些工作,并努力将部分SQL转换为正确的语法 我的SQL查询的简化版本:有两个表,UserDetails列表和TaskInstance跟踪他们是否被邀请完成任务,以及该任务的状态,无论是已完成还是待定 我希望返回在过去28天内注册的用户的用户ID,然后从该列表中排除任何已完成任务或已被邀请完成任务3次或以上的人(不存在) SELECT a.UserID FROM UserDetails WHERE (a.Regist

对实体框架来说是全新的,但我正在扩展另一个开发人员的一些工作,并努力将部分SQL转换为正确的语法

我的SQL查询的简化版本:有两个表,
UserDetails
列表和
TaskInstance
跟踪他们是否被邀请完成任务,以及该任务的状态,无论是已完成还是待定

我希望返回在过去28天内注册的用户的用户ID,然后从该列表中排除任何已完成任务或已被邀请完成任务3次或以上的人(不存在)

SELECT 
    a.UserID
FROM 
    UserDetails
WHERE
    (a.RegisteredDate >= DATEADD(DAY, -28, GETDATE() 
     AND IsAdminDisabled != true)
     AND NOT EXISTS (
                    --exclude anyone who has completed this task
                    SELECT b.UserID
                    FROM TaskInstance b
                    WHERE b.UserID = a.UserID
                      AND (b.taskName= 'XXXXX' AND b.Status = 'Completed'))
     AND NOT EXISTS (
                     --exclude anyone who has been invited to complete this task more then 3 times
                     SELECT c.UserID
                     FROM TaskInstance c
                     WHERE a.UserID = c.UserID
                       AND c.taskName= 'XXXXX'
                     GROUP BY c.UserID
                     HAVING COUNT(c.UserID) >= 3)
到目前为止,我的代码看起来是这样的,我知道这可能已经有一些错误,我将努力解决这些错误,但我丢失的是计数部分。 到目前为止,我想从我的结果中排除出现在TaskInstance表中3次或更多次并最终只返回UserID列表的任何UserID

   var eligibleUsers = await context.UserDetails
            .Where(a => (a.RegisteredDate >= DateTime.Now.AddDays(-28))   
            .Where(a => a.IsAdminDisabled != true && !context.TaskInstance.Any(si=>si.taskName== query.taskName && a.UserID== si.UserID && si.status = 'Completed'))                 
            .Where(a => (!context.TaskInstance.Any(si => si.TaskInstance== query.AppName && si.UserID== a.UserID))) //should check for count >=3 grouped by UserID
            .Select(a=>a.UserID)
            .ToListAsync();

对于大多数这样的问题,答案是

var-eligbluesers=wait context.UserDetails
.Where(a=>(a.RegisteredDate>=DateTime.Now.AddDays(-28))
.其中(a=>!a.isAdministrabled)
.Where(a=>!a.Tasks.Any(si=>si.taskName==query.taskName&&si.status='Completed'))
.Where(a=>a.Tasks.Count(si=>si.TaskInstance==query.AppName)a.UserID)
.ToListAsync();

先用部分,然后用RDBMS?第二部分,表的T-SQL?@JohnyL SQL检查组的答案server@Ray_Hack表的T-SQL?:)
  var eligibleUsers = await context.UserDetails
            .Where(a => (a.RegisteredDate >= DateTime.Now.AddDays(-28))   
            .Where(a => !a.IsAdminDisabled)
            .Where(a => !a.Tasks.Any(si=>si.taskName== query.taskName && si.status = 'Completed'))                 
            .Where(a => a.Tasks.Count(si => si.TaskInstance == query.AppName)<3)) 
            .Select(a=>a.UserID)
            .ToListAsync();