2010-03-02 11 views
47

Ich habe 2 eine Klasse:Linq Abfrageliste enthält eine Liste

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

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

So habe ich zwei Listen: Eine ObjectB (ListObjectB) und andere enthält eine Liste von IDs der ObjectA (genannt ListOfIdsA). Wenn dies ich eine Liste von ObjectB erhalten möchten, wo ObjectB.ListOfObjectA in der ListOfIdsA ist.

Mein erster (und falsch) Ansatz war

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

Aber das wirft natürlich eine Ausnahme. Ich google es, stackoverflowed, aber ich denke, dass meine Suchfähigkeiten darin nicht so gut gehen, kann jemand einen Ninja-Wisser davon geben? (prefereably in Lambda-Ausdruck)

Antwort

91

Sind Sie versuchen, eine Liste von ObjectBs zu bekommen, wo alle der ObjectAs in ListOfIdsA sind, oder jede von ihnen?

Ich glaube, Sie wollen entweder: (. Sie können auch ListOfIdsA eine HashSet<string> machen wollen, wenn es von signifikanter Größe ist, btw)

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

oder

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

+0

Neues lernen jeden Tag ... Aus irgendeinem Grund dachte ich, Extension-Methoden wären der Weg, um diesen zu lösen. –

+0

Ich möchte es von ihnen. Thx für die prompte Antwort (es war meine erste Frage hier und verdammt, das war schnell!) – Berto

+2

@Justin: Nun, wo, alle und alle * sind * Erweiterung Methoden :) –