LINQ to SQL join 3 Tabellen, und wählen Sie mehrere Spalten und auch mit Summe
Ich habe drei Tabellen Student, Stundenzettel und TimeRecord.
Talbe Spalten:
- Student : StudentId, Vorname,
Nachname - Stundenzettel: TimeSheetId,StudentId, IsActive
- TimeRecord: TimeRecordId,TimeSheetId, BonusHour(Typ int), CreationDate
Tabelle Beziehung:
- Schüler 1:N Stundenzettel (FK StudentId)
- Arbeitszeittabelle 1:N TimeRecord (FK TimeSheetId)
Student sample-Daten:
StudentId, Vorname, Nachname
- 10 , Makro , John
- 11 , Hiro , Edge
- 12 , Sarah , Zitrone
Arbeitszeittabellen-Daten Beispiel:
TimeSheetId, StudentId, IsActive
- 187 , 10 , True
- 196 , 11 , True
- 195 , 12 , True
- 199, 10 , False
- 200 , 12 , False
TimeRecord Beispieldaten:
TimeRecordId, TimeSheetId, BonusHour, IsValid, CreationDate
- 1 , 187 , 1 , True , 7/18/2010 10:23:25 Uhr
- 2 , 196 , 2 , True , 7/19/2010 2:23:25 Uhr
- 3 , 187 , 1 , False , 8/1/2010 2:5:25 UHR
- 4 , 187 , 3 , True , 8/9/2010 12:23:13 Uhr
- 5 , 196 , 0 , True , 7/20/2010 6:15:25 Uhr
- 6 , 196 , 2 , True , 9/18/2010 2:23:25 Uhr
- 7 , 195 , 3 , False , 8/18/2010 2:23:25 Uhr
- 8 , 199, 4 , False , 7/18/2010 2:23:25 Uhr
Ich würde gerne insgesamt BonusHour der einzelnen Schüler, nur Aktiv, Stundenzettel Gültige BonousHour, die zählen. So, das Ergebnis wird so sein wie etwas im folgenden:
Für den Monat Juli und so weiter für jeden Monat
- Hiro Edge hat 10hr für Juli 2010
- Sarah Lem hat 8 STD für Juli 2010
- Makro John hat 6hr für Juli 2010
Hier ist, was ich bisher ausprobiert:
Dim query = From ts In db.TimeSheet _
Join tr In db.TimeRecord On tr.TimeSheetId Equals ts.TimeSheetId _
Group By ts.StudentId, tr.TimeSheetId Into TotalTime = Sum(BonusHour)
Select StudentId, TimeSheetId, TotalTime
Komme ich nicht an die Verknüpfung der drei Tabellen doch Recht. Ich kann nur join zwei Tabellen so weit. Ich muss join Student-Tabelle der Abfrage zu bekommen student name.
Vielen Dank.
Update Eine
Dim query = From st In db.Student Select New With { .stName = st.FirstName & " " & st.LastName, _
.BonusHours = (From ts In st.TimeSheets Join tr in db.TimeRecord On tr.TimeSheetId Equals ts.TimeSheetId _
Where ts.IsActive = True And tr.IsValid = True _
Group By key = New With {ts.TimeSheetId, .MonthYear = (tr.CreationDate.Value.Month & "/" & tr.CreationDate.Value.Year)} Into BonusHr = Sum(tr.BonusHour)})}
Nun, das problem ist, dass, wie kann ich die "MonthYear" aus "BournsHours". Weil ich es will :
- Hiro Edge hat 10hr für Juli 2010
- Sarah Lem hat 8 STD für Juli 2010
- Makro John hat 6hr für Juli 2010
- Hiro Edge hat 0hr für August 2010
- Sarah Lem 3h für August 2010
- Makro John hat 2hr für August 2010
und so weiter für jeden Monat.
InformationsquelleAutor Narazana | 2010-08-19
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hier ist die Arbeits-Abfrage:
InformationsquelleAutor Narazana
Ich weiß, Sie wollen VB.NET code, aber ich habe nicht viel exp in VB.NET also hier ist C# code. Können Sie wandeln es mit Konverter.
Voraussetzung: Sie haben das Entity Framework und Mitarbeiter als notwendig.
Edit: Korrektur Tippfehler
InformationsquelleAutor Holystream
(einige C# und alternativen zur Klarheit weggelassen, siehe Geschichte)
C# VB.Net (weiß nicht, ob dieser korrekt ist VB.Net):
In Fällen, In denen Sie
unique
auf eine Spalte, die Sie verwenden sollten.Single
statt einerfrom
. Dieunique
s haben Sie auf die Spalten? Ist es einzigartig inTimeSheet
?Wenn Sie Assoziationen mit fremden Federn LINQ to SQL kann man dies viel einfacher.
Neben basierend auf den aktualisierten code (ich glaube nicht, dass das ist eigentlich gültigen code):
TimeRecordId
zuTimeSheetId
)Stundenzettel hat TimeSheetId PK so, es ist einzigartig. StudentId, TimeRecordId sind auch einzigartig.
Okay, aber kann es sein, mehrere Stundenzettel der gleiche student ist StudentId in TimeSheet einzigartig? Hat der code funktioniert? Auch, siehe letzter Satz in meiner Antwort.
Plase siehe mein update in Frage. Ja, die Tabellen die Beziehung. Ich zähle nur die BonousHour gültig ist, und hat Aktiv Stundenzettel.
Versuchen meinen code jetzt nochmal, ich bin mir nicht 100% sicher, dass Sie die gültigen VB.net code
InformationsquelleAutor Lasse Espeholt