2016-10-07 3 views
1

Я пытаюсь создать следующий запрос в LINQ-TO-SQL.SUM и COUNT в одном запросе LINQ to SQL

select count(*), sum(o.CostInCents) from Orders o 
where Flag = true; 

я придумал следующий запрос LINQ:

var q = db.Orders 
    .Where(o => o.Flag) 

var result = q 
    .GroupBy(o => 1) 
    .Select(g => new MyDTO 
    { 
     NoOfOrders = g.Count(), 
     TotalInCents = g.Sum(o => o.CostInCents) 
    }) 
    .SingleOrDefaultAsync(); 

Есть ли лучший способ?

.GroupBy(o => 1) даже хорошо?

Другой вариант - сделать два запроса, как показано ниже.

var q = db.Orders 
    .Where(o => o.Flag); 

//No groupBy 
var result2 = new MyDTO 
{ 
    NoOfCostedOrders = q.Count(),//hit the db 
    TotalInCents = q.Sum(o => o.CostInCents)//hit the db 2nd time 
}; 

Как я могу судить, какой подход лучше?

Заранее благодарен!

+0

Что касается производительности, я предлагаю сохранить iqueryable, пока вы все еще можете фильтровать, http://stackoverflow.com/a/1578977/3956100, кроме что я не совсем уверен, что вы хотите выполнить с кодом. – Niklas

+0

Каково ваше требование группировки для ордеров, не очень ясное, какое свойство вы хотите использовать –

+4

Все в порядке. Этот трюк называется ** группой константой ** и является единственным методом LINQ для создания нескольких агрегатов с одним запросом db. –

ответ

0

Это чист этот путь:

var sum = q.Sum(x => x.CostInCents); 
var count = q.Count(); 

Не прилипает к одной гильзе, если результат является нечитаемым, и грязным кодом. И вы избавитесь от группы по w/c - это дополнительные накладные расходы

+0

@MachineLearning спасибо, но группа в этом случае бесполезна. – Sherlock

+3

Использование группы константой - это именно то, чтобы уменьшить запросы db до 1 select вместо выдачи 2 (или более) запросов ... –

+0

@MachineLearning не аргумент для этого :), но в этом подходе запросы db отправляются только один раз. 'var q = db.Orders.Where (o => o.Flag)'. И последующие операции выполняются по результирующему значению – Sherlock

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

  • Нет связанных вопросов^_^