2009-09-01 33 views
27

Ich möchte meine Ergebnisse filtern, um nur die X Menge der Datensätze zu nehmen. Ich frage mich, wie funktioniert Take()?Linq Take() Frage

Auf dieser Seite, die ich gefunden: http://www.hookedonlinq.com/TakeOperator.ashx

Es sagt nehmen() „Löst ein Argument wenn Quelle null ist.“ Also was soll ich tun? Ich kann nicht garantieren, dass ich jedes Mal, wenn ich Take() mache, einige Datensätze in dieser Tabelle habe oder nicht.

Also muss ich zuerst zählen? Führen Sie dann eine weitere Abfrage durch, um sicherzustellen, dass einige Datensätze zu erfassen sind?

Auch was passiert, wenn die Ich habe eine Take (2) aber nur 1 Datensatz wird es die gleiche Ausnahme werfen?

Antwort

42

Es gibt einen Unterschied zwischen einer Nullreferenz und einer leeren Sammlung. Es ist in Ordnung, Take auf eine leere Sammlung zu nennen. Und das Argument gibt eine maximale Anzahl an, die es zu nehmen gilt. Es ist also gut, mehr als die Elemente in der Sammlung anzugeben.

Ich empfehle für genaue Details wie diese auf MSDN beziehen.

Für Linq to Objects: http://msdn.microsoft.com/en-us/library/bb503062.aspx

Für Link zu Datenbanken: http://msdn.microsoft.com/en-us/library/bb300906.aspx

+0

Gibt es entfernt es alle Ergebnisse dauern, oder die Anzahl der Ergebnisse begrenzen? Wie nur abhängig von bestimmten Bedingungen möchte ich die Anzahl der Ergebnisse begrenzen oder muss ich diese aufteilen (dh zu verschiedenen Methoden)? – chobo2

+1

@ chobo2: Genau das tut es schon. Wenn Sie nach 5 Elementen fragen, aber es nur 3 hat, erhalten Sie alle 3. –

9

Das Bezugs Ausnahme null ist nur, wenn Sie, dass gegen ein Objekt Quelle tun wie:

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

Wenn Wenn Sie Linq to SQL ausführen, wird ein LEERER Enumerator Ihrer Daten zurückgegeben, kein NULL-Verweis. Wenn Sie mehr als nur zur Verfügung stellen möchten, wird nur der verfügbare Betrag benötigt. Ich benutze diese Methode, um Daten in einigen Fällen und definitiv eine Menge Zeit zu pagen, wenn ich nach mehr Aufzeichnungen frage, als die Liste zur Verfügung hat.

+0

Der Aufruf einer beliebigen Methode auf 'null' wird eine NullReferenceException auslösen. ArgumentNullException wird ausgelöst, wenn Sie Take als statische Methode aufrufen: 'List list = null; Enumerable.Take (liste, 5); ' – knittl

2

Wird durch eine Ausnahme ausgeführt, wenn das Objekt, das es aufruft, null ist. Wahrscheinlich haben Sie kein Null-Objekt und keine oder weniger Zeilen sind nicht gleich (ich bin sicher, dass Sie die Semantik verstehen).

Wenn Sie eine Linq to SQL Zusammenhang mit und in der Art und Weise von

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

im Fall der Where Rückkehr Null Ergebnisse abfragen, werden Sie nicht eine Null-Ausnahme erhalten, weil Ihre Anfrage noch nicht hat Wurde nur 1 Ergebnis ausgeführt, erhalten Sie nur 1 Ergebnis zurück. Take begrenzt die Anzahl der zurückgegebenen Datensätze.

+0

" im Fall der Ergebnisse mit dem Ergebnis Null, erhalten Sie keine Null-Ausnahme, weil Ihre Abfrage noch nicht ausgeführt wurde "- Nein.Sie erhalten keine NULL-Ausnahme, wenn 'Where' keine Ergebnisse zurückgibt, wird eine Nicht-NULL-Referenz auf ein Objekt zurückgegeben, das eine leere Sequenz darstellt. –

0

die Anzahl der Elemente Graf, bevor Sie nehmen():

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

Dies ist nicht notwendig. Aus der [Dokumentation] (https://msdn.microsoft.com/en-us/library/bb503062 (v = vs.110) .aspx): "' Nimm 'zählt' source' auf und liefert Elemente bis 'count' Elemente wurden gefunden oder "source" enthält keine Elemente mehr. Wenn "count" die Anzahl der Elemente in "source" überschreitet, werden alle Elemente von source zurückgegeben. " –