2012-04-20 41 views
9

Tôi muốn tổng hợp ba trường khác nhau của một bảng trong một truy vấn. Tôi muốn có một tương đương LINQ này T-SQL:Nhận tổng của hai cột trong một truy vấn LINQ mà không cần nhóm

select sum(fld1), SUM(fld2), SUM(fld3) from MyTable where classID = 5 

Tất cả các ví dụ tôi đã tìm thấy một trong hai sử dụng một nhóm bởi hoặc gọi truy vấn nhiều lần, một lần cho từng lĩnh vực mà cần phải được tóm gọn.

Tôi có một cái gì đó như thế này ngay bây giờ. Nhưng tôi không muốn thêm một nhóm theo mệnh đề cho nó vì nó không được yêu cầu trong biểu mẫu T-SQL của nó.

from a in MyTable 
where a.classID == 5 
group a by a.classID into g 
select new 
{ 
Sumfld1 = g.Sum(x => x.fld1), 
Sumfld2 = g.Sum(x => x.fld2), 
Sumfld3 = g.Sum(x => x.fld3) 
} 

Mọi đề xuất? Cảm ơn vì đã dành thời gian cho tôi.

+1

Bạn có thể sử dụng 'nhóm a x 1 thành g' để áp dụng nhóm cần thiết bằng không có hiệu lực. – mellamokb

+0

Liệu nó có thực sự tạo ra sự khác biệt thực tế không để giới thiệu nhóm theo mệnh đề? Truy vấn sử dụng cả hai cách trong bao lâu? – Enigmativity

+0

tại sao bạn nhóm trên classId khi bạn cũng lọc trên classId. Tại sao không chỉ thả nhóm? –

Trả lời

1
var x = from a in MyTable 
     where a.classID == 5 
     select a; 

int? Sumfld1 = x.Sum(y => y.fld1); 
int? Sumfld2 = x.Sum(y => y.fld2); 
int? Sumfld3 = x.Sum(y => y.fld3); 
+2

điều này có vẻ như nó sẽ gọi truy vấn trong var X cho mỗi x.Sum (..) Sẽ thử nó và báo cáo lại. Cảm ơn. – user20358

+0

@ user20358 BẠN CÓ THỂ TÌM HIỂU GÌ? –

9

Khi nó quay ra, trong LINQ-to-SQL bạn có thể nhận được rất gần bằng cách thực hiện:

from a in MyTable 
where a.classID == 5 
group a by 0 into g 
select new 
{ 
    Sumfld1 = g.Sum(x => x.fld1), 
    Sumfld2 = g.Sum(x => x.fld2), 
    Sumfld3 = g.Sum(x => x.fld3) 
} 

(lưu ý nhóm bởi)

Nó không dịch vào một sql GROUP BY, nhưng một số SELECT của nhiều số SUM từ một truy vấn phụ. Xét về kế hoạch thực hiện, nó có thể giống nhau.

Khuôn khổ thực thể vẫn tạo một GROUP BY, mặc dù bằng 0.

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