2013-03-02 10 views
5

Non riesco a capire come interrogare un db usando linq in C# per ottenere tutti gli oggetti corrispondenti ad una lista o array di id e inserirli in una lista. Ad esempio:Query Linq che utilizza la lista o la matrice di id

Ho una tabella di articoli. Voglio creare un metodo che recuperi tutti gli elementi i cui ID sono in una matrice o lista di passaggi. L'ho cercato su google, ma presuppone sempre che io voglia solo interrogare una lista o un array piuttosto che interrogare usando una lista o un array.

Grazie in anticipo.

risposta

19

Sembra che si desidera qualcosa di simile:

var query = items.Where(item => validIds.Contains(item.Id)); 

Si noti che se questo è tutto locale (cioè in-process, LINQ to Objects) e si può avere un sacco di ID validi, probabilmente si vuole costruire a HashSet<T>.

Oppure si potrebbe fare un join, naturalmente:

var query = from id in validIds 
      join item in items on id equals item.Id 
      select item; 

(Ci sono un sacco di esempi di questo sul web e anche su Stack Overflow, ma posso capire che non è certo facile da trovare, come tutti i termini usereste sono comuni.)

+0

sembra che avrebbe funzionato per le mie esigenze. Lo proverò. Grazie! –

+0

Sfortunatamente questo diventa problematico quando si hanno molti ID. Si otterrà un errore nelle righe di "La richiesta in entrata ha troppi parametri. Il server supporta un massimo di 2100 parametri, poiché contiene non crea la query usando 'SELECT * FROM TABLE WHERE ID IN (x, y .... z)' ma inietta invece l'assegnazione di parametri. – ppumkin

+1

@ppumkin: In effetti, questo finisce per essere un problema - e per essere onesti, non so quale sia il modo supportato da EF di far fronte a questa situazione. –

0

Usa come quella

var subscriptionDetails = SubscriptionMasterBL.GetSubscriptionMasterDetails(); 
       tempUserList = lstSubscriberUsers.Where(a => subscriptionDetails.Any(b => b.SubscriptionUserId == a.Id 
        && b.TokenId != Guid.Empty)).ToList(); 
+0

Questo non sembra funzionare con una raccolta locale di ID ... per qualche motivo. Anche se ho letto da qualche parte dovremmo usare 'Any()' come molto più veloce di 'Contains()' .. ma non ho capito che potresti applicarlo alle query SQL .. in ogni caso ottengo l'errore 'La sequenza locale non può essere utilizzato nelle implementazioni LINQ e SQL degli operatori di query, ad eccezione dell'operatore Contains – ppumkin

Problemi correlati