Хорошо, что-то вроде этого. Мне нужно немного информации, чтобы быть уверенным, что
Очередь в очереди? Это имеет значение в 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();
Это удивительно более сложным в LINQ, чтобы сделать это. В середине чего-то, но я вернусь примерно за 30 минут и напишу, если у вас еще нет решения. Ключ должен сделать ваше дело анонимным результатом, затем ваша группа и сумма после него. – Gats
Спасибо. Намерение запроса, если не ясно, состоит в том, чтобы группировать по элементу очереди (продажа/кредит/покупка/и т. Д.) И сообщать, сколько отправлено, сколько осталось в очереди, сколько было успешным и сколько не удалось –
что. Я хочу помочь, поскольку мне нравится, как вы используете Суммы и случаи. Это тоже мой старый трюк, что я удивлен, что люди не используют больше, поскольку это очень быстро. Вы должны иметь в виду, что linq, очевидно, сделает это намного медленнее. Я по-прежнему предпочитаю хранимые procs для сложных агрегатов, так как левые команды присоединения могут выйти из-под контроля очень легко, но это должно быть хорошо. – Gats