c# - 使用 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 类型,这对于这个特定示例来说很自然。
解决方案
推荐阅读
- amazon-web-services - EC2 实例的 IP 地址在重启后被更改
- javascript - 通过另一个具有重复键的数组过滤对象数组
- javascript - 单击时更改离子项目的背景颜色
- xamarin.forms - 如何在listview分页中从api获取json数据
- java - 如何在 Java 中将泛型与类及其子类一起使用?
- python - 从 python 到 pyspark 的复杂函数 - 编辑:连接问题(我认为)
- c# - 从 Web 表单的 Page_Load 调用异步方法
- robotframework - 有时 winium 在我的代码中给出 NoSuchElementException
- python - 列表追加附加比预期更多的值
- google-chrome - Chrome 网络请求不显示 Cookie 选项卡、一些请求标头、复制为 cURL 已损坏