我是这个表:统计数据(id int,col1 int,col2 int,col3 int ...) 我想得到col1值,col2值,col3值等的总和。 一个简单的SQL查询:
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),
});
它生成一个复杂的查询。 这是正常的吗?
更新 这些是2个执行计划:
答案 0 :(得分: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]
执行计划:
答案 1 :(得分: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;}
}