首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用组获取结果将Sql转换为Linq

使用组获取结果将Sql转换为Linq
EN

Stack Overflow用户
提问于 2013-10-20 15:27:54
回答 2查看 159关注 0票数 0

我有一个查询,在那里我需要获得Commpliance和NonCompliance的计数

这是我需要的SQL版本来转换成linq..。

代码语言:javascript
复制
 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查询,但是得到了不同的结果

代码语言:javascript
复制
 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();
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-10-20 16:05:31

这取决于您的确切列定义。我用的是

代码语言:javascript
复制
Create Table Compliance_RiskRegisterEntry (
    ScheduleClause varchar(10),
    AuditDate datetime not null,
    RiskRegisterTypeID int not null,
    Auditor Int,
    Compliance bit not null
);

这样,下面的Linq就可以工作了:

代码语言:javascript
复制
compliance
    .Where(p => p.RiskRegisterTypeID == 1 && 
                p.Auditor == 5508 && 
                p.AuditDate.Month == 10 &&
                p.AuditDate.Year == 2013
    )
    .GroupBy(x => x.ScheduleClause)
    .Select(x => new {
        ScheduleClause = x.Key,
        Compliant = x.Sum(y => y.Compliance ? 1 : 0),
        NonCompliant = x.Sum(y => y.Compliance ? 0 : 1),
        GrandTotal = x.Count()
    });

您可以使用x.Sum(...)代替x.Count(y.Compliance),但是生成的查询似乎比使用求和更糟糕

票数 0
EN

Stack Overflow用户

发布于 2013-10-20 15:33:51

代码语言:javascript
复制
    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();
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19479188

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档