2010-09-02 3 views
0

J'ai une table appelée Game, qui contient 4 colonnes pour les ID de joueur. Et j'ai aussi une table appelée Player. Lorsque j'essaie de compter tous les jeux auxquels un joueur a participé, je n'obtiens que les joueurs de la première colonne du tableau Game. J'ai défini des clés étrangères pour toutes les tables, et cela s'affiche correctement dans le concepteur de table. De l'image ci-dessous, vous pouvez voir qu'il doit compter à partir Blue1 + 2 et + 2 red1, mais il ne compte que de Blue1 ...linq à sql ne comptant pas toutes les colonnes

alt text

J'ai essayé aussi de créer une méthode pour sélectionner manuellement tous les jeux:

public int GetPlayerGames(int playerID) 
{ 
    return (from game in db.Games 
      where game.Blue1 == playerID 
      || game.Blue2 == playerID 
      || game.Red1 == playerID 
      || game.Red2 == playerID 
      select game).Count(); 
} 

Mais quand je l'utilise dans une requête LINQ

return from player in db.Players 
     where GetPlayerGames(player.ID) > 0 
     select player; 

Je reçois cette erreur:
Method 'Int32 GetPlayerGames(Int32)' has no supported translation to SQL.

+0

Ressemble Jouer er est une relation de 1 à plusieurs. Dans votre enregistrement de jeu, existe-t-il un enregistrement dans lequel toutes les valeurs d'ID de joueur sont remplies? –

Répondre

0

En fait, je fini par utiliser la méthode ci-dessus, mais juste coulée à une première liste:

return from player in db.Players.ToList() 
     where GetPlayerGames(player.ID) > 0 
     select player; 
+0

Assurez-vous que vous êtes conscient des conséquences de "simplement le jeter à une liste" cependant. L'appel de db.Players.ToList() va à la base de données et récupère la totalité de la table de base de données en mémoire, puis applique le filtrage par la suite, en code. Ce n'est probablement pas ce que vous voulez: il ne s'agira pas bien quand le nombre de joueurs deviendra grand ... –

+0

Yup. Je connais. Pour l'instant, je suis à peu près sûr que la liste ne dépassera pas 20 joueurs. Mais vous avez absolument raison, ça ne va pas bien évoluer. Donc, jusqu'à ce que je trouve un bon moyen d'écrire des méthodes que linq comprend, je vais le garder comme ça, tout en gardant à l'esprit que je devrai refactoriser plus tard. – peirix

1

Si vous avez mis en place quatre relations qu'ils auront chacun un nom différent, très probablement Games, Games1, Games2 et Games3. En faisant player.Games.Count() vous ne comptant que les jeux associés à la première relation, vous devez ajouter compte supplémentaires pour les jeux associés par les autres relations:

var allGameCounts = player.Games.Count() + player.Games1.Count() + player.Games2.Count() + player.Games3.Count(); 
0

Si vous voulez faire le filtrage dans SQL sans charger la base de données entière, vous pouvez le faire ...

from player in db.Players 
where player.Games.Any() 
    || player.Games1.Any() 
    || player.Games2.Any() 
    || player.Games3.Any() 
select player 
Questions connexes