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 :
Und eine andere Tabelle wird nach einem Klick auf die Schaltfläche Filter erzeugt - das ist das grd_Teams
Raster:
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; }
}