T- SQL с GROUP BY, HAVING и COUNT в синтаксисе LINQ - PullRequest
0 голосов
/ 23 апреля 2020

Я изо всех сил пытаюсь преобразовать запрос T- SQL в синтаксис LINQ.

В T- SQL запрос выглядит так:

WITH FailedFiles AS 
(
  SELECT 1 AS FileExists
  FROM [FileHistory] f
  INNER JOIN [Users] u ON f.UerId = u.UserId
  GROUP by f.FileName
  HAVING SUM(CASE f.FileState WHEN 1 /*Success*/ THEN 1 ELSE 0 END) <= 0 
    AND SUM(CASE f.FileState WHEN 2 /*Failed*/ THEN 1 ELSE 0 END) >= 1
) 
SELECT COUNT(1) from FailedFiles

Имеются серьезные проблемы с преобразованием T - SQL выше в LINQ (не имеет значения, синтаксис запроса или синтаксис метода). Может кто-нибудь дать мне подсказку, как должен выглядеть правильный порядок и вложенность запроса LINQ?

что на самом деле делает запрос:

У меня есть таблица истории файлов с несколькими записями для отдельного файла. Необходимо знать, сколько всего неудачных файлов существует. Это означает, что файлы никогда не обрабатывались успешно (состояние 1) и хотя бы один раз обрабатывались с ошибкой (состояние 2). отдельные файлы сгруппированы по имени файла. Результатом запроса является одно число.

1 Ответ

1 голос
/ 23 апреля 2020

Ниже запрос должен работать в теории. Но может произойти сбой в зависимости от версии Entity Framework и провайдера.

var count =  (from f in context.FileHistory
              join u in context.User on f.UserId equals u.UserId
              select f)
              .GroupBy(f=> f.FileName)
              .Where(g=> 
                       g.Count(i=> i.FileState == 1) <=0  &&
                       g.Count(i=> i.FileState == 2) >=1 ).Count();
...