Dev*_*evT 5 c# linq linq-to-sql
我有这个表:统计(id int,col1 int,col2 int,col3 int ...)我想得到col1值,col2值,col3值等的总和. 一个简单的sql查询:
SELECT SUM([Col1]), SUM([Col2])
FROM [dbo].[Statistics]
Run Code Online (Sandbox Code Playgroud)
但在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);
...
Run Code Online (Sandbox Code Playgroud)
以这种方式工作,但这会在数据库上执行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),
});
Run Code Online (Sandbox Code Playgroud)
它生成一个复杂的查询.这是正常的吗?
更新 这些是2个执行计划:
在我的测试中,它生成一个相当简单的查询,生成的执行计划与没有的查询相同 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)
});
Run Code Online (Sandbox Code Playgroud)
生成的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]
Run Code Online (Sandbox Code Playgroud)
执行计划:
一切都取决于你的情况。您绝对正确,生成的查询不是最好的查询,但是您的数据库是否足够大来填补差异?作为选项,您可以编写和调用存储过程或原始查询:
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;}
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
7608 次 |
最近记录: |