2015-01-07 4 views
5

У меня есть эта таблица: Статистика (id int, col1 int, col2 int, col3 int ...) Я хочу получить сумму значений col1, значений col2, col3 ценности и т.д. простой SQL-запрос:Сумма нескольких столбцов в запросе LINQ

SELECT SUM([Col1]), SUM([Col2]) 
FROM [dbo].[Statistics] 

но в LINQ:

var val1 = db.Statistics.Sum(x => x.Col1); 
var val2 = db.Statistics.Sum(x => x.Col2); 
var val3 = db.Statistics.Sum(x => x.Col3); 
... 

Таким образом, работает, но это выполняет N запросов в базе данных. Я бы хотел выполнить только один. Единственным способом, который я нашел, является следующее:

var result = db.Statistics.GroupBy(x => 1).Select(x => new 
{ 
    val1 = x.Sum(k => k.Col1), 
    val2 = x.Sum(k => k.Col2), 
    val3 = x.Sum(k => k.Col3), 
}); 

что он генерирует сложный запрос. Это нормально?

UPDATE эти планы 2 исполнения:

enter image description here

+2

Мы не можем сказать вам, достаточно ли он для вас. Вы говорите нам. ** Измерьте это **. Если он работает достаточно хорошо для вас, то он достаточно хорошо подходит для вас. Если это не так, вы знаете, что нет. – Servy

+0

Возможный [дубликат] (http://stackoverflow.com/questions/2432281/get-sum-of-two-columns-in-one-linq-query) –

ответ

1

Все зависит от случая. Вы абсолютно правы, что сгенерированный запрос не самый лучший, но достаточно ли вам базы данных, чтобы заполнить разницу? Как варианты, вы можете написать и вызвать хранимую процедуру или необработанный запрос:

var result = db.ExecuteQuery<Dto>("SELECT SUM([Col1]) AS Sum1, SUM([Col2]) AS Sum2 FROM [dbo].[Statistics]") 

public class Dto 
{ 
    public int Sum1{get;set;} 
    public int Sum2{get;set;} 
} 
+0

Да, я могу, но это означает, что linq имеет ограничение на этот вид запроса, и я не был уверен в этом – DevT

5

В моих тестах он генерирует довольно простой запрос и план выполнения производится так же, как для запроса без GroupBy

Linq:

var result = tblSystems.GroupBy (s => 1).Select (s => new 
{ 
    val1 = s.Sum (x => x.fkInfoSubCatID), 
    val2 = s.Sum (x => x.fkCompanyID), 
    val3 = s.Sum (x => x.eventResult) 
}); 

Сгенерированный SQL:

-- Region Parameters 
DECLARE @p0 Int = 1 
-- EndRegion 
SELECT SUM([t1].[fkInfoSubCatID]) AS [val1], SUM([t1].[fkCompanyID]) AS [val2], SUM([t1].[eventResult]) AS [val3] 
FROM (
    SELECT @p0 AS [value], [t0].[fkInfoSubCatID], [t0].[fkCompanyID], [t0].[eventResult] 
    FROM [dbo].[tblSystem] AS [t0] 
    ) AS [t1] 
GROUP BY [t1].[value] 

План выполнения: enter image description here

+0

- это тот же план для SELECT SUM ([Col1]), SUM ([Col2]) FROM [dbo]. [Statistics]? – DevT

+0

Я не могу, конечно, проверить запрос, используя вашу базу данных. Но он должен генерировать тот же план (для такого простого запроса). – Magnus

+0

Я обновил первое сообщение с планами – DevT