2016-12-21 1 views
2

Für den Teil der Datenbank unten muss ich herausfinden, welches Team in der Saison die meisten Tore pro Spiel erzielte.Erstellen komplexer LINQ-Abfrage

part of database

Dafür verwendete ich Methoden

public List<Tour> GetAllTours(Guid seasonGuid){...} 

und

public List<SimpleMatch> GetMatches(Guid tour) 
{ 
    using (var db = new ConnectToDb()) 
    { 
     if (!db.Matches.Any()) return new List<Match>(); 
     var matches = db.Matches; 
     var matchesToReturn = new List<Match>(); 
     foreach (var item in 
      matches 
       .Include(x => x.Home) 
       .Include(x => x.Guest) 
       .Include(x => x.Result) 
       .Include(x => x.Tour)) 
     { 
      if (item.Tour.Id != tour) 
      matchesToReturn.Add(item); 
     } 

     return matchesToReturn; 
    } 
} 

und

public List<SimpleTeam> GetTeamMostGoalInSeason(List<Match> matches){...} 

wo SimpleTeam ein Team mit Cou ist nt Ziele, wenn Teams mit max count == viele, List es Methode ist nicht winzig, und ich weiß nicht, wie dies mit LINQ-Abfrage.

+0

Wenn mehrere Teams die gleiche Anzahl an Toren pro Spiel erzielt haben, geben Sie alle diese Teams zurück? Ihr Code sagt ja, aber Ihre Beschreibung sagt nein. Auch die Beziehung zwischen 'Matches' und' Results' ist falsch. Ein Ergebnis könnte nur 1 Übereinstimmung haben, nein? Die richtige Beziehung ist ein 1-1 oder einfach alle Ergebnisse löschen – Shoe

+0

Ja, Beziehung 'Matches' und' Ergebnisse' müssen 1-1, danke – Venedchuk

+0

@Shoe ist entweder falsch oder OP versucht/wurde gebeten, alle möglichen Ergebnisse zu haben eine Tabelle und nur Referenz in jedem Spiel das entsprechende Ergebnis –

Antwort

1

nicht sehr effizient, aber meine Idee wäre so etwas wie dieses:

matches.SelectMany(match => new[] { 
    new TeamScore { 
     TeamId = match.HomeId, 
     Goals = match.Result.HomeTeamGoals 
    }, 
    new TeamScore { 
     TeamId = match.GuestId, 
     Goals = match.Result.GuestTeamGoals 
    } 
}) 
.GroupBy(score => score.Goals) 
.OrderByDescending(group => group.Key) 
.First() 
.Select(score => score.TeamId); 

wo TeamScore eine einfache Struktur ist.

Dadurch wird ein IEnumerable mit allen Teams zurückgegeben, die die meisten Tore erzielt haben (wenn es die gleiche Anzahl war). Sie müssen wahrscheinlich einige der Eigentumsnamen oder andere Details ändern. Ich bin nicht vertraut mit LINQ zu Datenbanken.

Wenn Sie nur einen wollen, könnten Sie First() machen, aber das würde den ersten auswählen und andere ignorieren, abhängig von der Reihenfolge. SingleOrDefault() würde NULL zurückgeben, wenn es ein Draw ist, wenn es das ist, was Sie wollen.

EDIT: Um alle Spiele in allen Touren zu bekommen, würden Sie so etwas tun: GetAllTours(...).SelectMany(tour => GetMatches(tour)) aber da Sie mit einer Datenbank zu tun haben, könnten Sie fragen Sie einfach für alle direkt übereinstimmt.