具有LINQ语法的GROUP BY,HAVING和COUNT的T-SQL

问题描述 投票:0回答:1

我正在努力将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查询的正确顺序和嵌套应该是什么样吗?

查询实际上做什么:

我有一个文件历史记录表,其中包含单个文件的多个条目。需要知道总共有多少failed个文件。意味着文件从未成功地处理过(状态1),并且至少一次处理了错误(状态2)。单个文件按文件名分组。查询结果是一个数字。

entity-framework linq tsql linq-to-sql
1个回答
0
投票

以下查询应在理论上起作用。但它可能会失败,具体取决于实体框架和提供程序的版本。

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();
© www.soinside.com 2019 - 2024. All rights reserved.