Frage

In der Tat, das ist die gleiche Frage wie dieser Beitrag:

Wie kann ich sicherstellen, dass meine LINQ-Abfragen ausgeführt werden, wenn in meinem DAL, nicht in einer verzögerten Art und Weise genannt?

Aber da er nicht erklären Warum er es wollte, scheint die Frage über etwas weitergegeben worden zu sein. Hier ist mein ähnlich aber-besser erläuterte Problem:

Ich habe eine Handvoll von Threads in zwei Typen (UI-Threads für einen Moment ignoriert). Es gibt einen „Datensammel“ Gewindetyp und ein „Berechnung“ Gewindetyp. Die Daten Kräuselfäden sind langsam. Es gibt eine ziemlich viel von Daten aus einer Vielzahl von Orten gesichtet werden. Die Berechnung Gewinde sind vergleichsweise schnell. Das Design-Modell bis zu diesem Punkt ist aus dem Datenerfassungs Threads zum Senden von Daten zu finden, und wenn sie vollständigen Durchlauf für die Berechnung die Daten auf.

Wenn ich meine Datenerfassung in Linq codiert gewickelt ich einige dieser Langsamkeit Hissen bis zurück in meine Berechnung Fäden . Inzwischen gibt es Datenelemente, die nicht vollständig gelöst zu werden, bis sie während der Berechnung gewohnt sind - und das ist ein Problem

.

Ich mag Linq zwingen, seine Arbeit zu einem bestimmten Zeitpunkt (Ende der Aussage? Ende Methode? „Sie beenden, verdammt noch mal“ Call-Methode) zu beenden, so dass ich weiß, dass ich nicht für sich zahle später . Hinzufügen „.ToList ()“ bis zum Ende des Linq ist 1. umständlich und 2. fühlt sich an wie Boxen etwas, das über ist, um momentan ohnehin in einem anderen Thread unboxed werden.

War es hilfreich?

Lösung

Sie würden nicht Boxen alles sein -. Sie würden die Ergebnisse werden Pufferung

ToList() ist im Prinzip der Weg zu gehen, wenn Sie die Daten tatsächlich wollen. Es sei denn, Sie bereit sind, die Daten sofort verwenden, ist es bekam gepuffert werden irgendwo , hat es nicht? Eine Liste ist nur eine bequeme Möglichkeit, das zu tun.

Die Alternative ist die Verarbeitung dann und dort auch zu tun - die Daten verwenden, wie Sie es produzieren eifrig. Ich habe nicht ganz die verschiedenen Threads Seite der Sache zu folgen, so ist es mir nicht klar, ob das würde dir helfen, aber das ist im Grunde die Möglichkeiten zur Verfügung, um Sie so weit ich sehen kann.

Dies ist eigentlich etwas explizit in Ihrer Beschreibung:

  

Das Design-Modell bis zu diesem Punkt ist   zum Senden von Daten-Kräuselfäden AUS   finden Daten, und wenn sie komplett   übergeben Sie die Daten bis zur Berechnung.

Beim ToList() ändert sich im Grunde, was Sie von „einer Abfrage, die die Daten, wenn sie gefragt holen kann“ zurück zu „die Daten selbst, gepuffert in einer Liste“.

Andere Tipps

Können Sie erklären, warum .ToList nicht akzeptabel ist? Sie erwähnten Boxen und Unboxing aber die sind völlig unabhängig von Themen.

Teil einer LINQ-Abfrage zu zwingen, zu vervollständigen auf Nachfrage erfordert die Ergebnisse zu speichern. Ansonsten, um wieder die Ergebnisse zu sehen, würden Sie die Abfrage repprocess haben. .ToList effizient erreicht dies, indem die Elemente in einer List<T> speichert.

Es ist möglich, die Elemente in praktisch jede andere Sammlung Stil Datenstruktur mit verschiedenen Abwägungen zu speichern, die Ihren Bedürfnissen besser entsprechen können.

Es gibt eine LoadOptions Eigenschaft in der DataContext Klasse, die Sie die Daten eifrigen holen könnte helfen.

sonst könnte man ein paar cleveren platziert ToList() ‚s verwendet werden.

Ich weiß, dass dieses Thema alt ist ... wie auch immer, lustig niemand erwähnte .ToLast () vor. Ich mache etwas, wo Linq nicht viel mehr als eine bessere foreach sind einige Nebenwirkungen fahren, in dem ich wirklich nicht über das Abfrageergebnis kümmern ... so dass ich nicht mehr gefälschte Speicher als nötig zuordnen will.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top