2010-03-02 5 views
47

J'ai 2 est une classe:liste de requêtes LINQ contient une liste

public class ObjectA 
{ 
    public int Id; 
    public string Name; 
} 

public class ObjectB 
{ 
    public int Id; 
    public string Name; 
    public List<ObjectA> ListOfObjectA; 
} 

J'ai donc deux listes: une des ObjectB (ListObjectB) et une autre contient une liste des id de ObjectA (appelé ListOfIdsA). Si cela je veux obtenir une liste d'ObjectB où ObjectB.ListOfObjectA est dans le ListOfIdsA.

Ma première (et mal) approche a été

ListObjectB.Where(p=> ListOfIdsA.Contains(p.ListOfObjectA.Select(b=>b.Id))) 

Mais cela jette évidemment une exception. Je le google, stackoverflowed, mais je pense que mes compétences de recherche ne vont pas si bien dans ce domaine, quelqu'un peut-il donner un ninja plus awser de cela? (Prefereably dans l'expression lambda)

Répondre

91

Êtes-vous essayer d'obtenir une liste de tous les ObjectBs où des ObjectAs sont en ListOfIdsA, ou toute d'entre eux?

Je pense que vous voulez soit: (. Vous voudrez peut-faire ListOfIdsA un HashSet<string> si elle est de taille importante, btw)

ListObjectB.Where(p => p.ListOfObjectA.Any(x => ListOfIdsA.Contains(x.Id))) 

ou

ListObjectB.Where(p => p.ListOfObjectA.All(x => ListOfIdsA.Contains(x.Id))) 

+0

savoir quelque chose de nouveau tous les jours ... pour une raison ou une autre, je pensais que les méthodes d'extension étaient le moyen de résoudre celui-ci. –

+0

Je le veux n'importe lequel d'entre eux. Merci pour la réponse rapide (c'était ma première question ici, et putain, c'était rapide!) – Berto

+2

@Justin: Eh bien où, tout et tout * sont * méthodes d'extension :) –

Questions connexes