2015-01-07 18 views
5

Tôi đã có bảng này: Số liệu thống kê (id int, col1 int, col2 int, col3 int ...) Tôi muốn lấy tổng các giá trị col1, giá trị col2, col3 giá trị, vv Một truy vấn đơn giản sql:Tổng của nhiều cột trong truy vấn LINQ

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

nhưng trong 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); 
... 

Bằng cách này làm việc, nhưng điều này thực hiện N truy vấn trên cơ sở dữ liệu. Tôi muốn thực hiện chỉ một. Cách duy nhất tôi tìm thấy là:

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), 
}); 

rằng nó tạo truy vấn phức tạp. là bình thường?

CẬP NHẬT đó là những kế hoạch thực hiện 2:

enter image description here

+2

Chúng tôi không thể cho bạn biết nếu nó hoạt động đủ tốt cho bạn. Bạn nói họ. ** Đo nó **. Nếu nó hoạt động đủ tốt cho bạn, thì nó hoạt động đủ tốt cho bạn. Nếu nó không, bạn biết nó không. – Servy

+0

Có thể [sao chép] (http://stackoverflow.com/questions/2432281/get-sum-of-two-columns-in-one-linq-query) –

Trả lời

1

Tất cả mọi thứ phụ thuộc vào trường hợp của bạn. Bạn hoàn toàn đúng, mà tạo ra truy vấn không phải là tốt nhất, nhưng cơ sở dữ liệu của bạn đủ lớn để điền vào sự khác biệt? Như các tùy chọn, bạn có thể viết và gọi thủ tục lưu trữ, hoặc truy vấn liệu:

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

vâng tôi có thể, nhưng điều này có nghĩa là LINQ có giới hạn cho loại truy vấn này và tôi không chắc chắn về điều này – DevT

5

Trong các thử nghiệm của tôi nó tạo ra một truy vấn khá đơn giản và kế hoạch thực hiện sản xuất cũng giống như cho một truy vấn mà không có sự 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 tạo:

-- 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] 

Kế hoạch thực hiện: enter image description here

+0

là nó cùng một kế hoạch cho SELECT SUM ([Col1]), SUM ([Col2]) FROM [dbo]. [Thống kê]? – DevT

+0

Tôi không thể kiểm tra truy vấn bằng cách sử dụng cơ sở dữ liệu của bạn. Nhưng nó sẽ tạo ra cùng một kế hoạch (cho một truy vấn đơn giản như vậy). – Magnus

+0

Tôi đã cập nhật bài đăng đầu tiên với các gói – DevT

Các vấn đề liên quan