sql-server - 将SQL CASE WHEN语句加组语句转换为LINQ

标签 sql-server linq-to-sql group-by case-when

如何使用流利的 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/

相关文章:

sql-server - 如果取消索引重组任务,是否有可能导致数据库损坏?

sql-server - 愚蠢用户的可用 View ?

LinqToSQl 和 Member 访问在类型异常上不合法

带有 "group by with cube"和 NULL 值的 SQL 查询

python - pandas 中的频率表(如 R 中的 plyr)

mysql - SQL Query Select 基于 Group By 的条件

sql - 在 SQL 中的 SubQuery 中分配列的值

sql-server - 将文本转换为 varchar(MAX)

c# - Linq2SQL,异常后使用dataContext

linq - 你 ToList() 吗?