2012-12-27 11 views
9

Widziałem mnóstwo przykładów z LINQ zawiera na prostej listy obiektów:LINQ Where Zawiera gdzie lista ma skomplikowany obiekt

var intList= new List<int>() { 1, 2, 3 }; 
var result = db.TableRecords.Where(c => intList.Contains(c.RecordId)).ToList(); 

Co usiłuję zrobić wydaje się nieco bardziej skomplikowane (myślę). Mam linia kodu podobnego do tego robi mi listę muszę:

var xzList = db.Relations.Where(r => someOtherList.Contains(r.zId)) 
         .Select(r => new { AId = r.xId, BId = r.zId }) 
         .ToList(); 

a teraz chcę, aby uzyskać wynik podobny do poprzedniego przykładu, ale lista ma teraz typ anonimowy w nim z dwóch wskazówki . Więc jak mam teraz uzyskać result gdzie RecordId w TableRecords jest równy AId w anonimowym typie dla każdego anonimowego typu w xzList?

+0

var intList = xzList.Select (listObject => listObject.AId) .ToList(); – GunnerL3510

Odpowiedz

11

Wygląda na to, że nie jesteś pewien, jak uzyskać wartości z anonimowego typu. Można użyć roztworu GunnerL3510 by zrzucić go na liście, lub powinno być w stanie inline to tak:

var result = 
    db.TableRecords 
     .Where(c => xzList.Select(n => n.AId) 
      .Contains(c.RecordId)) 
     .ToList(); 

Ponieważ jesteś nazywania wartości w swojej anonimowej typu, odnieść się do nich, podobnie jak właściwości.

Jeśli preferujesz bardziej uporządkowane podejście, możesz użyć metody this.

+0

Chciałem napisać 'c => xzList.Any (n => n.AId == c.RecordId)' ale jest mniej więcej takie samo. Jeśli chcesz najpierw zrzucić wszystkie "AId" do osobnej kolekcji (która może być szybsza, "Rozwiązanie GunnerL3510"), rozważ użycie 'HashSet ', np .: 'new HashSet (xzList.Select (n => n. AId)) '. –

+0

OK, więc wygląda na to, że muszę zrzucić zawartość listy z obiektami anon na listę tylko int, a następnie zrobić zawartość na nowej liście. Sądzę, że myślałem, że będzie inny sposób odnoszenia się do Listy .Contains(), ale zaczyna to nie wyglądać w ten sposób. –

+0

@SailingJudo Nie, to nie jedyna możliwość. Możesz uderzyć strzałkę lambda mojego pierwszego komentarza, jeśli wolisz. –

0

tak:

db.TableRecords.Select(c=>c.RecordId).Intercept(xzList.Select(n => n.AId)).Any()