2016-05-18 10 views
0

Meine Frage ist eine akademische Frage darüber, wie man eine Liste von Spielern mit der gleichen CurrentTeamId aus einer anderen Liste von Teams mit der gleichen CurrentLeagueId erhalten um eine Liste von Spielern anzuzeigen, die zu demselben gehören CurrentLeagueId.Versuchen, eine Liste der Spieler der gleichen Liga durch zwei Tabellen ohne einen direkten Schlüssel Link zu erhalten

Aber die Player Klasse hat nicht die CurrentLeagueId Eigenschaft; die Team Klasse, von der die Spieler Mitglieder sind. Die Klasse Player hat eine TeamId Fremdschlüsseleigenschaft, die mit der Klasse Team verknüpft ist, nicht jedoch mit der Klasse League. Die Klassenhierarchie lautet dann wie folgt über die Navigation: League ->Team ->Player.

Die Klassenhierarchie durch Fremdschlüssel sind in umgekehrter Richtung: Player ->Team ->League

Das heißt, ich muss zuerst eine Liste der Teams erhalten die gleiche CurrentLeagueId mit, in denen sie Mitglied sind. Mehr als ein Team sind Mitglieder.

Dann, von dieser Liste, erhalten Sie eine Liste aller Spieler aus jedem Team mit der gleichen TeamId, die dann mein Ziel ist. Dies sind Mitglieder der Liga basierend auf dem gleichen CurrentLeagueId.

Hier ist mein Code, die ich wahrscheinlich nicht elegant gebe zu, aber es funktioniert bis zu einem Punkt:

public void BindPlayers_byLeague() 
{ 
    using (var db = new SoccerDbContext()) 
    { 
     IQueryable<Team> teams = db.Teams; 
     IQueryable<Player> players = db.Players; 

     //if any league is selected, then filter below. Do not run if first run. 
     //if first run, the whole list is displayed in the grid. This also happens on form reset. 
     if (0 < Convert.ToInt32(drp_Leagues1.SelectedValue) && !OKtoRun) 
     { 
      //get all the teams with the same CurrentLeagueId first, 
      //based on currently selected league on league dropdownlist 
      var leagueId = Convert.ToInt32(drp_Leagues1.SelectedValue); 
      teams = teams.Where(t => t.CurrentLeagueId == leagueId); 

      //display in team grid 
      grd_Teams.DataSource = teams.ToList(); 
      grd_Teams.DataBind(); 

      //read it back in 
      List<Team> eteam = (List<Team>)grd_Teams.DataSource; 

      //obtain 
      foreach (Team teamitem in eteam) 
      { 
       int teamId = Convert.ToInt32(teamitem.TeamId); 
       players = players.Where(t => t.CurrentTeamId == teamId); 

      } 
      //display in player grid 
      grd_Players.DataSource = players.ToList(); 
      grd_Players.DataBind(); 
     } 
    } 
} 

Aus dem obigen Code ist das folgende Ergebnis - das ist das grd_Players Gitter :

One of two table results

Und eine andere Tabelle wird nach einem Klick auf die Schaltfläche Filter erzeugt - das ist das grd_Teams Raster:

two of two table results

Ziemlich offensichtlich, diese Codezeile ist ein Problem, weil es in einer for-Schleife ist:

players = players.Where(t => t.CurrentTeamId == teamId); 

Und es funktioniert nicht, wieder, weil es für die Schleife in einem ist. (Es funktioniert in der ersten Schleife, aber nicht in den restlichen Schleifen.) Ich versuche, eine Liste der Spieler zu bekommen, die zu jedem TeamId in der teams (kleine "t") Liste gehören (es gibt 4 verschiedene TeamId s drin) und zeige es an. Hoffentlich ist diese Präsentation klar genug, um zu fragen: Wie kann ich den Code verbessern? (Für die Zwecke der Spieler Ergebnisse in einem Raster angezeigt wird, das grd_Teams Gitter ist nicht notwendig oder erforderlich ist.)

Als Referenz unten ist die Team Klasse:

public class Team 
    { 
     public int TeamId { get; set; } 

     [Required] 
     [MaxLength(100)] 
     public string TeamName { get; set; } 

     public DateTime DateEstablished { get; set; } 

     //Navigation property -> Each team has many players 
     public List<Player> Players { get; set; } 

     //Navigation property -> Each team belongs to a specific league 
     public League CurrentLeague { get; set; } 

     //Foreignkey -> The associated LeagueId 
     //[Required] 
     [ForeignKey("CurrentLeague")] 
     public int CurrentLeagueId { get; set; } 

    } 

Antwort

0

Sie sind für SelectMany suchen:

var players = eteam.SelectMany(t => t.Players);