2010-08-09 173 views
2

我對linq很新,所以這個應該很容易回答,但是我很難找到答案。Linq to SQL:Group By和Sum()

我有以下LINQ語句,它執行一個簡單的LINQ查詢並分配所產生的值標籤的asp.net web窗體上:

 Dim db As New MeetingManagerDataContext 
    Dim q = From s In db.vwRoomAvailabilities _ 
       Where s.MeetingID = lblMeetingID.Text _ 
       Select s.AllRequestedSingles, s.AllRequestedDoubles, s.AllBookedSingles, s.AllBookedDoubles, SinglesNeeded = s.AllRequestedSingles - s.AllBookedDoubles, DoublesNeeded = s.AllRequestedDoubles - s.AllBookedDoubles 

    lblSinglesRequested.Text = "Singles Requested: " & q.FirstOrDefault.AllRequestedSingles 
    lblSinglesBooked.Text = "Singles Booked: " & q.FirstOrDefault().AllBookedSingles 
    lblSinglesNeeded.Text = "Singles Needed: " & q.FirstOrDefault().SinglesNeeded 
    lblDoublesRequested.Text = "Doubles Requested: " & q.FirstOrDefault().AllRequestedDoubles 
    lblDoublesBooked.Text = "Doubles Booked: " & q.FirstOrDefault().AllBookedDoubles 
    lblDoublesNeeded.Text = "Doubles Needed: " & q.FirstOrDefault().DoublesNeeded 

本來有打算是隻有一行結果你可以看到我使用FirstOrDefault()來獲取那個很好的單個值。但是設計已經改變,現在查詢可以返回多行。我現在需要按照上面的MeetingID分組,並對每個選定的列進行SUM(即s.AllRequestedDoubles)。

我發現很多分組和總結樣本,但沒有一個看起來很適合這種情況。

你能幫我修改上面的LINQ來總結結果值而不是顯示第一行結果值嗎?

回答

5

試試這個

From s In db.vwRoomAvailabilities 
Where s.MeetingID = lblMeetingID.Text 
Group by s.MeetingID 
into SumAllRequestedDoubles = sum(s.AllRequestedDoubles), 
    SumAggregate2 = sum(s.SomeField2), 
    SumAggregate3 = sum(s.SomeField3) 
Select SumAllRequestedDoubles, SumAggregate2, SumAggregate3 

,將讓你開始對單個列執行SUM。

您需要將每個SUM'd列投影到一個新的別名列(就像我上面所做的那樣)。

此外,由於您是LINQ-SQL的新手,請查看LinqPad - 它會震動您的世界。

+0

因此,我需要爲每個列我需要寫一個這樣的個人陳述?沒有辦法在一個Select中對所有列進行求和? – David 2010-08-09 23:50:03

+0

好吧,如果我明白你的問題,你不想將所有的列總和成一個單一的結果字段,你需要總結每列的記錄(總和單打req'd,總和單打預訂等)。因此你需要提供每一欄。考慮一下,如果你在原始T-SQL中編寫它,你仍然需要編寫SELECT SUM(a),SUM(b),SUM(c)等。 – RPM1984 2010-08-10 00:06:24

+0

Right,sum(a),sum(b ),總和(三)是在一個單一的說法,這聽起來像你說我需要寫一個完全獨立的FROM/WHERE/GROUP/SELECT linq語句我需要總結每列。 你能在我的示例代碼中顯示2個列的總和嗎? – David 2010-08-10 00:17:17