Абсолютно новый для Entity Framework, но я расширяю некоторую работу другого разработчика и пытаюсь преобразовать часть моего SQL в правильный синтаксис.
Упрощенная версия моего SQL-запроса: есть 2 таблицы, список UserDetails
и TaskInstance
, которые отслеживают, были ли они приглашены для выполнения задачи, и ее состояние, а такжезавершено или ожидает рассмотрения.
Я хочу вернуть идентификаторы пользователей для пользователей, зарегистрированных в течение последних 28 дней, а затем исключить из этого списка (не существует) всех, кто выполнил задание или уже был приглашен для выполнения задания 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)
Мой код до сих пор выглядит следующим образом, я ценю, что это может уже иметь некоторые ошибки, которые я буду обрабатывать и исправлять, но это часть Count, которая потеряла меня.До сих пор я хочу исключить из своих результатов любые идентификаторы пользователей, которые появляются в таблице TaskInstance 3 раза или более, и в конечном итоге возвращать список только идентификаторов пользователей.
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();