3

流暢な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?

4

3 に答える 3

4

わかりました、このようなもの。確かめるには少し情報が必要ですが、

少しキューに入れられていますか?これは、SQL にはない linq に違いをもたらします。私はあなたのコンテキスト名も知りませんが、アイデアを得る必要があります。

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();

編集クエリでオンザフライでケースを実行することにより、これらを組み合わせることもできます。エラーがある場合、より複雑な集計はデバッグが少し難しい場合があるため、私は常に最初に上記のように書き出す傾向があります。

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();
于 2012-01-03T11:27:22.480 に答える
2

Gatts ソリューションの代わりに、次のようなことができます

var query = Context.ExportQueues.
.GroupBy(x => x.QueueItem)
.Select(g => new { 
  QueueItem = g.Key,
  Sent = g.Count(x=>!x.Queued),
  Queued = g.Count(x => x.Queued),
  Exported = g.Count(x => x.Success),
  Failed = g.Count(x => !x.Failed)
}).ToList();
于 2012-01-03T11:40:03.750 に答える
0

LINQ を使用してこれを記述するには、実際には非常に時間がかかります。最初にグループ化してから、ラムダ式を使用して集計を処理する必要があります。次のようなものです:

from eq in ExportQueue
group eq by new {
    eq.QueueItem
} into temp
select new {
    temp.Key.QueueItem,
    Agg1 = temp.Sum(n => n.Queued == 0 ? 1 : 0),
    Agg2 = temp.Sum(n => n.Queued == 1 ? 1 : 0)
}

などなど、LinqPad はこれを機能させるのに非常に役立ちます。

于 2012-01-03T11:34:33.277 に答える