2012-01-03 2 views
3

Как я могу написать в свободном синтаксисе linq заявление «case when» sql?Преобразование SQL CASE WHEN инструкция оператора оператора в LINQ

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?

+0

Это удивительно более сложным в LINQ, чтобы сделать это. В середине чего-то, но я вернусь примерно за 30 минут и напишу, если у вас еще нет решения. Ключ должен сделать ваше дело анонимным результатом, затем ваша группа и сумма после него. – Gats

+0

Спасибо. Намерение запроса, если не ясно, состоит в том, чтобы группировать по элементу очереди (продажа/кредит/покупка/и т. Д.) И сообщать, сколько отправлено, сколько осталось в очереди, сколько было успешным и сколько не удалось –

+0

что. Я хочу помочь, поскольку мне нравится, как вы используете Суммы и случаи. Это тоже мой старый трюк, что я удивлен, что люди не используют больше, поскольку это очень быстро. Вы должны иметь в виду, что linq, очевидно, сделает это намного медленнее. Я по-прежнему предпочитаю хранимые procs для сложных агрегатов, так как левые команды присоединения могут выйти из-под контроля очень легко, но это должно быть хорошо. – Gats

ответ

4

Хорошо, что-то вроде этого. Мне нужно немного информации, чтобы быть уверенным, что

Очередь в очереди? Это имеет значение в 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(); 
+0

хорошее решение Gatts! –

+0

Они на самом деле поля с нулевым битом, поэтому я изменил ваш 'Sent =! X.Queued? 1: 0' в 'Sent = x.Queued! = True? 1: 0' и т. Д. Но группировка не работает, она возвращает одну группу для каждой строки. –

+0

Я ошибся в QueueItem = x. Отредактированная версия должна быть лучше. QueueItem = x.QueueItem, – Gats

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 будет очень полезен в попытке заставить это работать.

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

Это тоже должно работать, хотя я думаю, что это может привести к созданию дополнительных подзапросов. Я собираюсь попробовать их обоих и профилировать их, когда я получаю время, так как это интересно. – Gats

+1

Plz сообщите нам, когда u сделал с ним –

+0

+1 Также очень хороший метод –

Смежные вопросы