2009-09-01 20 views
27

Voglio filtrare i miei risultati per prendere solo la quantità X di record. Mi chiedo come funziona Take()?Linq Take() domanda

Su questo sito che ho trovato: http://www.hookedonlinq.com/TakeOperator.ashx

Dice Prendere() "genera un ArgumentNullException se la sorgente è nullo." Quindi cosa dovrei fare? Non posso garantire che ogni volta che faccio un Take() avrò alcuni record in quel tavolo o no.

Quindi devo prima fare un conteggio? Quindi fai un'altra query per assicurarti che ci siano alcuni record da afferrare?

Inoltre cosa succede se ho un Take (2) ma solo 1 record getterà questa stessa eccezione?

risposta

42

C'è una differenza tra un riferimento null e una raccolta vuota. Va bene chiamare Take su una collezione vuota. E l'argomento specifica un numero massimo da prendere, quindi è anche bene specificare più di quanti siano gli elementi nella collezione.

Consiglio di fare riferimento a MSDN per dettagli precisi come questo.

Per LINQ to Objects: http://msdn.microsoft.com/en-us/library/bb503062.aspx

Per collegamento ai database: http://msdn.microsoft.com/en-us/library/bb300906.aspx

+0

C'è via per fare ci vuole tutti i risultati o limitare il numero di risultati? Come solo a seconda di determinate condizioni, voglio limitare il numero di risultati o dovrò suddividerlo (cioè con metodi diversi)? – chobo2

+1

@ chobo2: è esattamente quello che fa già. Se chiedi 5 articoli ma ne ha solo 3, ti darà tutti 3. –

9

che NULL un'eccezione di riferimento è solo se si sta facendo che contro una fonte oggetto come:

List<MyObject> myList = null; 
myList.Take(5); // this would produce the error, of course 

Quando stai eseguendo Linq su SQL, restituirà un enumeratore EMPTY dei tuoi dati, non un riferimento null. Per lo stesso motivo, se si sta tentando di prendere più di quanto è disponibile, verrà preso solo l'importo disponibile. Io uso questo metodo per impaginare i dati in alcuni casi e sicuramente molto tempo in cui chiederò più record di quelli disponibili.

+0

Chiamare qualsiasi metodo su "null" genererà una NullReferenceException. ArgumentNullException verrà lanciata se invochi Take come metodo statico: 'List list = null; Enumerable.Take (lista, 5); ' – knittl

2

Take will attraverso un'eccezione se l'oggetto che la richiama è null. È probabile che tu non abbia un oggetto nullo e che avere o meno righe non sia lo stesso (sono sicuro che capisci la semantica).

Se si utilizza un LINQ to contesto SQL e l'interrogazione alla moda del

Context.MyTable.Where(x => x.ID > 0).Take(2); 

nel caso delle Where ritorno zero risultati, non sarà possibile ottenere un'eccezione nullo, perché la query non ha ancora è stato eseguito, quindi nel caso contenga solo 1 risultato, finirai per ottenere solo 1 risultato. Take limita la quantità di record restituiti.

+0

" nel caso di Dove restituiscono zero risultati, non si otterrà un'eccezione nulla, perché la query non è stata ancora eseguita "- No.Non si otterrà un'eccezione null perché se "Dove" non restituisce risultati, restituisce un riferimento non nullo a un oggetto che rappresenta una sequenza vuota. –

0

contare il numero di elementi prima di prendere():

List<string> a = new List<string>(); 
      int count = a.Count > 12 ? 12 : a.Count; 
      a.Take(count); 
+0

Questo non è necessario. Dalla [documentazione] (https://msdn.microsoft.com/en-us/library/bb503062 (v = vs.110) .aspx): "' Take 'enumera' source' e produce elementi fino a 'count' gli elementi sono stati restituiti o 'source' non contiene più elementi. Se' count' supera il numero di elementi in 'source', vengono restituiti tutti gli elementi di' source'. " –

Problemi correlati