2015-03-24 2 views
7

Come dovrei scrivere un istruzione LINQ che seleziona gli oggetti padre che hanno un oggetto figlio corrispondente nella sua raccolta? Ecco le classi di esempio.Linq per selezionare oggetti padre in cui oggetti figlio hanno un oggetto figlio corrispondente

class Parent { 
    int ID { get; set; } 
    string Name { get; set; } 
    List<Child> Children { get; set; } 
} 

class Child { 
    int ID { get; set; } 
    string Name { get; set; } 
    string Nickname { get; set; } 
} 

Nell'esempio sopra, vorrei restituire tutti i genitori che contengono un bambino con un nickname specifico.

+2

Votare la domanda era piuttosto duro. Ho cercato SO * e * Google entrambi prima di digitare questa risposta astratta. Se gli strumenti qui fossero migliori, forse non avrei una domanda doppia. –

+2

Venerato. Questo è stato il risultato migliore per la mia ricerca su Google "linq selezionare gli oggetti padre in base agli oggetti figlio". Se avessi il rappresentante, lo cancellerei come duplicato; la domanda collegata fornisce una risposta simile, ma il modo in cui il titolo della domanda è formulato non è intuitivamente simile. – Will

+1

Grazie per quello. –

risposta

18

Questo è straightfoward LINQ to Objects:

listOfParents.Where(p => p.Children.Contains(childObjectToMatch)) 

Per Linq to Entities, se l'oggetto bambino non è tracciato come un'entità potrebbe essere necessario abbinare sul campo bambino oggetto identificativo:

int childObjectIdToMatch = childObjectToMatch.ID; 
dbContext.Parents.Where(p => p.Children.Any(c => c.ID == childObjectIdToMatch)); 
+1

Grazie per aver dedicato del tempo a fornire una risposta. Sei stato molto utile. –

+0

Grazie per avermi ricordato di Any() durante il controllo di una proprietà figlio. – gregsonian