Giả sử bạn có các câu lệnh SQL sau:
select sum(A), max(B), avg(C) from TBL group by D
Hãy thử điều này trong C# :
from t in table
group t by D
into g
select new {
s = g.Sum(x => x.A),
m = g.Max(x => x.B),
a = g.Average(x => x.C)
}
- hoặc trong VB: -
from t in TBL
group t by key = D
into g = group
select s = g.Sum(function(x) x.A),
m = g.Max(function(x) x.B),
a = g.Average(function(x) x.C)
Rõ ràng, mà trong VB sẽ là:
aggregate t in TBL into s = Sum(t.A), m = Max(t.B), a = Average(t.C)
mặc dù nó sẽ cho kết quả tương tự, nó có một chi phí cao hơn khi nó phát hành nhiều câu lệnh SQL chọn, một cho mỗi hàm tổng hợp, nghĩa là nó sẽ chạy trong nhiều lần truyền.Cú pháp đầu tiên, đưa ra một câu lệnh SQL đơn (khá phức tạp, nhưng hiệu quả) mà thực hiện một lần truyền duy nhất đối với cơ sở dữ liệu.
PS. Nếu bạn không có khóa để nhóm theo (nghĩa là bạn cần một hàng duy nhất là kết quả, bao gồm toàn bộ tập dữ liệu), hãy sử dụng hằng số như sau:
from t in TBL
group t by key = 0
into g = group
select s = g.Sum(function(x) x.A),
m = g.Max(function(x) x.B),
a = g.Average(function(x) x.C)
+1 cho câu hỏi thú vị đã không tự mình nhìn vào nó nhưng sẽ thật kỳ lạ nếu nó không hoạt động. Bạn không thể sử dụng cú pháp 'let'? –
@Thomas, như xa như tôi có thể thấy nó không thể gán một tập hợp bằng cách sử dụng 'let', mà là một giá trị duy nhất cho một mục trong tập hợp. Tôi đã sử dụng EF trong vài tháng và đã rất ngạc nhiên khi đạt được rào cản này ngày hôm nay. Tôi thực sự không nghĩ rằng nó có thể! Câu trả lời đã xóa của 01 thợ săn @ –
@ hunter. Bạn đã thử à? Ngoài ra, 'let' thực sự làm việc với các bộ. Bạn đã thử chưa Tôi có mã sản xuất làm cả hai. –