如何使用流利的 linq 语法编写“case when”sql 语句?
select QueueItem, COUNT(*) as [Count],
SUM(CASE WHEN Queued = 0 THEN 1 ELSE 0 END) AS [Sent],
SUM(CASE WHEN Queued = 1 THEN 1 ELSE 0 END) AS Queued,
SUM(CASE WHEN Success = 1 THEN 1 ELSE 0 END) AS Exported,
SUM(CASE WHEN Success = 0 THEN 1 ELSE 0 END) AS Failed
from ExportQueue x
group by QueueItem
是否有一些程序可以将 SQL 转换为 LINQ?也许是 LinqPad?
最佳答案
好的,像这样。不过,我需要一些信息来确定
有点排队吗?这在 linq 中有所不同,而在 SQL 中却没有。 我也不知道您的上下文名称,但您应该明白了。
var query = Context.ExportQueues.Select(x => new {
QueueItem = x.QueueItem,
Sent = !x.Queued ? 1 : 0,
Queued = x.Queued ? 1 : 0,
Exported = x.Success ? 1 : 0,
Failed = !x.Success ? 1 : 0 })
.GroupBy(x => x.QueueItem)
.Select(g => new {
QueueItem = g.Key,
Sent = g.Sum(x => x.Sent),
Queued = g.Sum(x => x.Queued),
Exported = g.Sum(x => x.Exported),
Failed = g.Sum(x => x.Failed)
}).ToList();
EDIT 您还可以通过在查询中即时进行案例来组合这些。我总是倾向于先按上面的方式写出来,因为如果有错误,更复杂的聚合可能有点难以调试:
var query = Context.ExportQueues
.GroupBy(x => x.QueueItem)
.Select(g => new {
QueueItem = g.Key,
Sent = g.Sum(x => !x.Queued ? 1 : 0),
Queued = g.Sum(x => x.Queued ? 1 : 0),
Exported = g.Sum(x => x.Success ? 1 : 0),
Failed = g.Sum(x => !x.Success ? 1 : 0 )
}).ToList();
关于sql-server - 将SQL CASE WHEN语句加组语句转换为LINQ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8711416/