SQL для Entity Framework - Не существует Количество и группа по в заявлении - PullRequest
0 голосов
/ 21 мая 2018

Абсолютно новый для 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();

1 Ответ

0 голосов
/ 21 мая 2018

Ответ на большинство подобных вопросов: Свойства навигации .

  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();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...