| 

.NET C# Java Javascript Exception

2
Für meinen Fußballverein hacke ich gerade eine kleine Webseite zusammen mit der Mannschaften und Spieler (und noch einiges mehr, ist jetzt aber nicht so wichtig) verwaltet werden sollen. Auf der Übersichtseite werden alle Mannschaften mit dem Namen des Torwarts dargestellt. Das geht so:

var list = from m in linqContext.Mannschafts
select new { m, Torwart = m.Spieler.FirstOrDefault(s => s.IstTorwart) };


Das geht auch, ist aber ziemlich langsam, weil für jede Mannschaft eine weitere Abfrage ausgeführt wird um den Torwart zu bestimmen. Wie kann ich diese Abfrage umschreiben, dass nur eine einzige Abfrage an die Datenbank geht?

Edit:
Die Tabellen sehen so aus:
class Mannschaft { ... }
class Spieler { int MannschaftID; bool IsTorwart; }
08.08.2009
Maddinel 145 2 4
1
Wie sieht denn die Tabellenstruktur aus?
gfoidl 08.08.2009
3 Antworten
3
Versuche es mal anders herum. Ermittle alle Torwarte aus den Spielern und dafür die benötigten Manschaftsinformationen, oder verwende gleich joins

var fast =
from m in Manschaft
join s in Spieler on m.ID equals s.ManschaftID && s.IsTorwart
select ....
18.08.2009
me 1,1k 2 9
1
Anmerkung: Mit den DatLoadOptions werden die JOINs intern erzeugt.
gfoidl 18.08.2009
1
Perfekt. Das Ergebnis ist auch korrekt, weil genau ein Spieler IsTorwart == true hat (sonst würden ja mehrere Ergebniszeilen ausgegeben).
Maddinel 19.08.2009
3
Einfach so mal aus dem Kopf. Ich gehe davon aus das linqContext.Mannschafts eine Collection mit Manschaften ist. Dann würde ich es so versuchen.

var list = from m in linqContext.Mannschafts 
where m.IstTorwart
select new {m.ManschaftName, m.Torwart};


Dann ist list eine Collection die man durchlaufen kann. Vielleicht musst du noch das new anpassen damit du alle nötigen Daten hast.

FirstOrDefault gibt dir nur 1 Record zurück.
11.08.2009
GENiALi 2,5k 1 2 8
1
Das setzt aber eine denkbar ungünstige Tabellenstruktur voraus.
Laut deiner Query müsste die Tabelle Mannschafts ein Feld 'IstTorwart' haben und weiters den Mannschaftsnamen sowie eine Feld für den Torwart.
Eine 'klassische' normalisierte Tabellenstruktur löst das Problem von selbst.
gfoidl 11.08.2009
1
m steht ja nicht für die Manschaften sondern für eine Manschaft. Mannschafts ist eine Collection, m ein Item. Ob eine Manschaft ein IstTorwart hat... Das ist eine andere Frage.
GENiALi 11.08.2009
1
Wie sähe denn die normalisierte Tabellenstruktur aus?
Maddinel 12.08.2009
1
PS: Habe den Post um die Tabellenstruktur erweitert.
Maddinel 12.08.2009
2
Mit den DataLoadOptions des DataContext kann eingestellt werden welche Daten auf einmal übertragen werden sollen. Für weitere Infos darüber verweise ich auf die MSDN: DataLoadOptions.
13.08.2009
gfoidl 9,4k 3 5

Stelle deine .net-Frage jetzt!
TOP TECHNOLOGIES CONSULTING GmbH