C# 使用group将Sql转换为Linq会得到错误的结果

C# 使用group将Sql转换为Linq会得到错误的结果,c#,sql,linq,asp.net-mvc-4,C#,Sql,Linq,Asp.net Mvc 4,我有一个查询,需要获取符合和不符合的计数 这是SQL版本,我需要它转换为linq select ScheduleClause, COUNT(case Compliance when 1 then 1 end) Compliance, Count(case Compliance when 0 then 1 end) NonCompliance from Compliance_RiskRegisterEntry cr where

我有一个查询,需要获取符合和不符合的计数

这是SQL版本,我需要它转换为linq

 select ScheduleClause,
    COUNT(case Compliance 
            when 1 then 1 end) Compliance,
    Count(case Compliance
            when 0 then 1 end) NonCompliance
 from Compliance_RiskRegisterEntry cr
 where cr.RiskRegisterTypeId = 1 and Auditor = 5508 and MONTH(AuditDate) = 10 and           YEAR(AuditDate) = 2013
group by ScheduleClause
我尝试了这个linq查询,但得到了不同的结果

 compliance
     .GroupBy(x => new
     {
       x.ScheduleClause, x.Compliance
     })
     .Where(x => x.Key.Compliance == 1)
     .Select(x => new RiskRegisterCompliancePerCategoryDto
         {
             ScheduleClause =  x.Key.ScheduleClause,
             Compliant = x.Key.Compliance == 1 ? 1 : 0,
             NonCompliant = x.Key.Compliance == 0 ? 1 : 0,
             GrandTotal = x.Count()
          }).ToList();

这取决于具体的列定义。这是我用的

Create Table Compliance\u risk registerentry(
附表条款varchar(10),
AuditDate日期时间不为空,
RiskRegisterTypeID int不为空,
国际核数师,
符合性位不为空
);
这样,以下Linq工作:

合规性
其中(p=>p.RiskRegisterTypeID==1&&
p、 审计师==5508&&
p、 审核日期.月份==10&&
p、 审计日期。年度==2013年
)
.GroupBy(x=>x.ScheduleClause)
.选择(x=>new{
ScheduleClause=x.键,
合规=x.Sum(y=>y.合规?1:0),
不合规=x.和(y=>y.合规?0:1),
GrandTotal=x.Count()
});

您可以使用
x.Count(y.Compliance)
而不是
x.Sum(…)
,但是为此生成的查询看起来比使用Sum更糟糕,因为您似乎没有从SQL查询中翻译where子句。
    compliance
         .Where(p=> p.RiskRegisterTypeId = 1 && p.Auditor = 5508 && 
                    SqlFunctions.DatePart("MM", p.AuditDate) = 10 &&
                    SqlFunctions.DatePart("yy", p.AuditDate) = 2013)
         .GroupBy(x => x.ScheduleClause)
         .Select(x => new RiskRegisterCompliancePerCategoryDto
             {
                 ScheduleClause =  x.Key.ScheduleClause,
                 Compliant = x.Key.Compliance == 1 ? 1 : 0,
                 NonCompliant = x.Key.Compliance == 0 ? 1 : 0,
                 GrandTotal = x.Count()
              }).ToList();