2012-04-30 16 views
5

Sto cercando di capire un po 'di più su LINQ e usarlo un po' di più, quindi un po 'di lavoro di sviluppo di sé andando qui ...Oggetto con LINQ

Ho un oggetto come segue:

Ora, dato un elenco di giocatori, vorrei selezionare quelli che hanno precedentemente giocato per vari club selezionati, potrei farlo facilmente con un paio di istruzioni foreach nidificate - ma mi piacerebbe farlo con Linq ...

Ho provato questo, ma non viene restituito da esso:

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 
    } 

Qualsiasi aiuto su dove sto andando male? I dati esistono sicuramente perché quando ho un ciclo foreach che scorre sui club all'interno di un loop che scorre sui giocatori e restituisco una collezione di tutti i giocatori che hanno giocato per i club 1,2 & 3 ci sono dati ...

Effettivamente dovrebbe restituire diverse istanze di un oggetto HistoryOfPlayer, tutte contenenti i nomi degli stessi 3 club (dato che sono collegati su ID) - come dico io, è un po 'di autoapprendimento, quindi provando ad applicarlo allo sport quindi mi infila un po 'in testa !!

Qualcuno può dare una mano?

+0

È necessario eseguire il collegamento con "Join" di "Dove" in LINQ-To-Objects per motivi di prestazioni: http://stackoverflow.com/questions/5551264/why-is-linq-join-so-much-faster -than-linking-with-where –

risposta

4

si potrebbe rendere più dinamico

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) 
       }; 

modifica dopo Svik sue osservazioni:

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) 
       }; 

* notare che questo è scritto senza un IDE, quindi non ho controllato se funziona.

+0

Non credo che questa query faccia ciò che viene richiesto. La query originale richiede ai giocatori che in 1, 2 ** e ** 3. Quindi, qualcosa come 'dove clubIds.All (c => player.PreviousClubs.Contains (c))'. – svick

+0

@svick Sì, come ho detto, non ho un computer vicino che potrei testare ma hai ragione a destra – Frederiek

+0

@svick Ma poi dovrebbe essere il contrario. Un giocatore avrebbe potuto essere in più club credo. – Frederiek