2012-04-30 12 views
5

Busco a entender un poco más acerca de LINQ y usarlo un poco más, así que un poco de sí el trabajo de desarrollo que va aquí ...población objeto con LINQ

Tengo un objeto de la siguiente manera:

public class Player(){ 

    public string Name{get;set;} 

    public Club currentClub{get;set;} 

    public IEnumerable<Club> previousClubs{get;set;} 

} 

Ahora, dada una lista de jugadores, me gustaría seleccionar las que anteriormente han jugado para varios clubes seleccionados, podría hacerlo fácilmente por un par de declaraciones foreach anidados - pero me gustaría hazlo con Linq ...

He intentado esto, pero no se devuelve nada de él:

var prevClubs = 
    from player in players 
    from clubOriginal in player.previousClubs 
    from clubSecond in player.previousClubs 
    from clubThird in player.previousClubs 
    where clubOriginal.ID == 1 
    where clubSecond.ID == 2 
    where clubThird.ID == 3 
    select new HistoryOfPlayer{ 
     firstClub == clubOriginal.Name, 
     secondClub == clubSecond.Name, 
     thirdClub == clubThird.Name 
    } 

¿Alguna ayuda en donde me estoy equivocando? Los datos definitivamente existen porque cuando tengo un bucle foreach girando sobre los palos dentro de un bucle que gira sobre los jugadores y devuelvo una colección de todos los jugadores que han jugado para los clubes 1,2 & 3 hay datos ...

Efectivamente debería devolver varias instancias de un objeto HistoryOfPlayer, todas con los nombres de los mismos 3 clubes (dado que están vinculadas en ID) - como digo, es un poco autoaprendizaje, por lo que intenta aplicarlo al deporte así que se queda en mi cabeza un poco!

¿Alguien puede ayudar?

+0

Debería vincular con 'Join' isntead de' Where' en LINQ-To-Objects por motivos de rendimiento: http://stackoverflow.com/questions/5551264/why-is-linq-join-so-much-faster -than-linking-with-where –

Respuesta

4

que podría hacerlo más dinámico

List<int> clubIds = new List<int> { 1, 2, 3}; 
var prevClubs = from player in players 
       where player.previousClubs.Any(m => clubIds.Contains(m.ID)) 
       select new HistoryOfPlayer { 
        Player = player, 
        Clubs = player.previousClubs 
           .Where(m => clubIds.Contains(m.ID)) 
           .Select(c => c.Name) 
       }; 

edición después Svik su discurso:

List<int> clubIds = new List<int> { 1, 2, 3}; 
var prevClubs = from player in players 
       where clubIds.All(id => player.previousClubs 
               .select(club => club.ID) 
               .contains(id)) 
       select new HistoryOfPlayer { 
        Player = player, 
        Clubs = player.previousClubs 
           .Where(m => clubIds.Contains(m.ID)) 
           .Select(c => c.Name) 
       }; 

* Nota Esto es escrita, sin una IDE, por lo que no he comprobado si funciona.

+0

No creo que esta consulta haga lo que se solicita. La consulta original pregunta a los jugadores que en 1, 2 ** y ** 3. Entonces, algo así como 'donde clubIds.All (c => player.PreviousClubs.Contains (c))'. – svick

+0

@svick Sí, como he dicho, no tengo ninguna computadora cercana que pueda probar, pero usted es probalmente correcto – Frederiek

+0

@svick Pero entonces debería ser al revés. Un jugador podría haber estado en más clubes, creo. – Frederiek