2012-12-27 12 views
9

Ho visto esempi di LINQ con contiene su un semplice elenco di oggetti:LINQ clausola Where con Contiene dove la lista ha un sacco oggetto complesso

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

Quello che sto cercando di fare sembra un po 'più complicato (penso). Ho una riga di codice simile a questa mi fa l'elenco che ho bisogno:

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

E ora voglio ottenere il risultato simile all'esempio precedente, ma la lista ha ora un tipo anonimo in essa con due int . Quindi, come potrei ora ottenere result dove RecordId in TableRecords equivale allo AId nel tipo anonimo per ogni tipo anonimo in xzList?

+0

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

risposta

11

Sembra che tu non sia sicuro su come ottenere i valori dal tuo tipo anonimo. È possibile utilizzare la soluzione di GunnerL3510 di scaricare a un elenco, o si dovrebbe essere in grado di inline in questo modo:

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

Dal momento che si denomina i valori nel vostro tipo anonimo, si fa riferimento a loro solo come proprietà.

Se si preferisce eseguire un approccio più strutturato, è possibile utilizzare il metodo this.

+0

Stavo per scrivere 'c => xzList.Any (n => n.AId == c.RecordId)' ma è più o meno lo stesso. Se si desidera scaricare tutti i file 'AId' in una raccolta separata (che potrebbe essere più veloce," soluzione GunnerL3510 "), considerare l'uso di un' HashSet ', come:' nuovo HashSet (xzList.Select (n => n. AID)) '. –

+0

Ok, quindi sembra che ho bisogno di scaricare il contenuto della lista con oggetti anon in una lista di solo interi, quindi fare il contiene sul nuovo elenco. Immagino che stavo pensando che ci sarebbe un altro modo per fare riferimento alla lista . Contiene() ma inizia a non guardare in questo modo. –

+0

@SailingJudo No, non è l'unica possibilità. Puoi scegliere la freccia lambda del mio primo commento, se preferisci. –

0

Qualcosa di simile a questo:

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