Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/274.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# LINQ查询中多列的总和_C#_Linq_Linq To Sql - Fatal编程技术网

C# LINQ查询中多列的总和

C# LINQ查询中多列的总和,c#,linq,linq-to-sql,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] 但在林克: var val1 = db.Statistics.Sum(x => x.Col1); var val2 = db.Statistics.Sum(x => x.Col2); var val3 =

我有这个表:统计(id int,col1 int,col2 int,col3 int…) 我想得到col1值、col2值、col3值等的总和。 一个简单的sql查询:

SELECT SUM([Col1]), SUM([Col2])
FROM [dbo].[Statistics]
但在林克:

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),
});
它会生成一个复杂的查询。 这正常吗

更新 以下是两个执行计划:


一切都取决于你的情况。您完全正确,生成的查询不是最好的查询,但您的数据库是否足够大以弥补差异?作为选项,您可以编写和调用存储过程或原始查询:

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;}
}
var result=db.ExecuteQuery(“从[dbo].[Statistics]]中选择SUM([Col1])作为Sum1,选择SUM([Col2])作为Sum2)
公共类Dto
{
公共int Sum1{get;set;}
公共int Sum2{get;set;}
}

在我的测试中,它生成了一个相当简单的查询,生成的执行计划与没有
GroupBy的查询相同

林克:

生成的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]
执行计划:

我们无法告诉您它是否适合您。你告诉我们。测量一下。如果它对你来说足够好,那么它对你来说也足够好。如果没有,您知道它没有。可能是的,我可以,但这意味着linq对这种查询有一个限制,我不确定这是从[dbo].[Statistics]中选择SUM([Col1])、SUM([Col2])的相同计划吗?我当然不能使用您的数据库测试查询。但它应该生成相同的计划(对于这样一个简单的查询)。
-- 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]