首页 > 解决方案 > 使用 GROUP、JOIN、SUM + CASE 引用除分组表之外的 LINQ 查询

问题描述

我得到了一些 SQL 语句作为统计图表的来源,当我尝试将其转换为 LINQ(查询)时,最后一个语句给我带来了问题。我已经看到发布了几个类似的问题,但对我来说这里的问题是 CASE 和 SUM 不在分组表上,而是在另一个加入的表上。如何从提供的 SQL 中获取工作 LINQ?

这是我得到的 SQL:

select a.Name,sum(case when rp.TypeId in (1,3) then 1 else 0 end) as 'Information', sum(case when rp.TypeId in (2,4) then 1 else 0 end) as 'Maintenance' from POAs p 
join ReceivedPOAs rp on (p.id=rp.id)
join Agents a on (rp.AgentId=a.Id)
where ISNULL(p.InsertedInUpdateDatabaseMode,'N')='N'
group by a.Name
order by count(*) desc

...运行时会导致:

Name            Information Maintenance
Broker1         133         35
Insurer2        99          37
Insurer1        92          2
Broker2         53          15
Test AB         33          3
Our Partners    6           1
Your AB         1           1
Last One        1           0

我遇到的问题是那些

sum(case when rp.TypeId in (1,3) then 1 else 0 end)

...因为他们指的是“rp”而不是组上的“a”(我发现的所有示例都对组中的某些内容进行了总和)

我开始以与我之前的工作翻译相同的格式编写代码,但是很快意识到我不知道在我的代码中的哪里添加...

            var query = p in POAs.Where(x => x.InsertedInUpdateDatabaseMode == null || x.InsertedInUpdateDatabaseMode == "N")
                        join rp in ReceivedPOAs on p.Id equals rp.Id
                        join a in Agents on rp.AgentId equals a.Id
                        group a by a.Name into ag
                        orderby ag.Count() descending
                        select new StatReportDataItems
                        {
                            Label = ag.FirstOrDefault().Name,
                            NumData1 = (double)
                            (
                                rp.TypeId == 1 || rp.TypeId == 3 ? 1 : 0
                            )
                        };
            return query.ToList();

如果有人想将 SQL 代码更改为可更好地转换为 LINQ 查询的版本,我觉得这很好。我也可以将 LINQ 查询更改为两个或更多部分,如果它正常工作:-)

以纯方法语法获得解决方案也可以,但由于程序中的其他 LINQ 查询是以查询格式编写的,我更喜欢这样。

因此,调用的结果将是一个 StatReportDataItems 列表。这用于所有图表例程,因此 NumData1 是 double 类型而不是 int 类型,这对于这个特定示例来说很自然。

标签: c#.netlinq

解决方案


推荐阅读