2016-12-06 7 views
2

Ich habe zwei Tabellen. Eine heißt Round, die zwei Spalten enthält, die CompetitionId und StartDate genannt werden (plus eine Menge anderer Spalten, die für diese Frage unwichtig sind). Ich habe auch eine Tabelle namens Competition mit einer Spalte namens Id. Die ist ein Fremdschlüssel zu Competition.Id (eine Eins-zu-viele-Beziehung - ein Wettbewerb könnte viele Runden haben). SoVerwenden von OrderBy in Linq

wenn Entity Framework diese Tabellen C# -Klassen übersetzt, es gibt mir zwei Klassen, eine Round, die einen Verweis auf Competition und ein Competition mit einem IEnumerable<Round> hat.

Jetzt möchte ich eine Linq Abfrage ausführen, die alle meine Wettbewerbe zurückgibt, die von der StartDate Tabelle Round gespeichert werden aber gruppiert durch die logische runde Zahl wie durch das Datum bestimmt. Also zum Beispiel, ich habe zwei Wettkämpfe mit jeweils 3 Runden. Ich möchte, dass die zwei ersten Runden (plus ihre Wettbewerbsinformationen) zurückgegeben werden, gefolgt von den zwei zweiten Runden und so weiter.

Irgendwelche Ideen, wie ich das machen kann?

Antwort

3

Wie wäre es damit so etwas wie:

var results = Competitions 
    .SelectMany(c => 
     c.Rounds 
     .OrderBy(r => r.StartDate) 
     .Select((r, i) => new 
     { 
      RoundNumber = i + 1, 
      Round = r, 
      Competition = c 
     }) 
    )   
    .OrderBy(r => r.RoundNumber) 
    .ThenBy(r => r.Round.StartDate) 
    .ThenBy(r => r.Competition.Id) 
    .ToList(); 

Dann können Sie die Ergebnisse wie folgt aufzählen, zum Beispiel:

foreach (var item in results) 
{ 
    Console.WriteLine(string.Format("{0:MMM dd, yyyy} - Round {1} of Competition {2}", 
         item.Round.StartDate, item.RoundNumber, item.Competition.Id)); 
} 

Demo: https://dotnetfiddle.net/U515UK

+0

tnx für .net Geige – barakcaf

+0

Dank der Einführung @BrianRogers. Anfangs war der Compiler nicht glücklich mit der Abfrage, da ich 'var results = _dbContext.Competitions ...' hatte, aber nachdem ich den Code in 'var Competitions = _dbContext.Competition.ToList(); aufgeteilt habe', folgte ich ihm Dein Code, es hat wie ein Zauber funktioniert. Danke nochmal für die Hilfe. –

+0

@houman_ag Kein Problem; Ich bin froh, dass du es in Gang gebracht hast. –