EF множественный агрегат в одном запросе - PullRequest
3 голосов
/ 11 ноября 2010

Я хочу получить счет набора на основе другого условия:

 var invoices = new AccountingEntities().Transactions
 var c1 = invoices.Count(i=>i.Type = 0);
 var c2 = invoices.Count(i=>i.Type = 1);
 var c3 = invoices.Count(i=>i.Type = 2);

Как можно вызвать все три запроса в одном цикле БД для повышения производительности?

Ответы [ 2 ]

7 голосов
/ 11 ноября 2010

Конечно, просто сверните три счета в POCO или анонимном типе:

using (var invoices = new AccountingEntities())
{
    var c = (from i in invoices.Transactions
             select new 
             {
                 c1 = invoices.Count(i=>i.Type = 0),
                 c2 = invoices.Count(i=>i.Type = 1),
                 c3 = invoices.Count(i=>i.Type = 2)
             }).Single();           
}

Кроме того, избавьтесь от своего контекста, как я показываю.

2 голосов
/ 28 июня 2018

Для агрегирования произвольных подзапросов используйте фиктивный однострочный набор результатов, из которого вы вложите нужные подзапросы.Предполагая, что db представляет ваш DbContext, код для подсчета типов счетов будет выглядеть следующим образом:

var counts = (
    from unused in db.Invoices
    select new {
        Count1 = db.Invoices.Count(i => i.Type == 0),
        Count2 = db.Invoices.Count(i => i.Type == 1),
        Count3 = db.Invoices.Count(i => i.Type == 2)
    }).First();

Если вы хотите получить общее количество всех типов, используйте группирование:

var counts =
    from i in db.Invoices
    group i by i.Type into g
    select new { Type = g.Key, Count = g.Count() };
...