2016-04-24 6 views
6

Ich werde in Kürze mit der Arbeit an Xamarin beginnen und viel Code von Android Studio's Java nach C# übertragen.Wie führt Linq den Code zum Abrufen von Daten aus der Datenquelle tatsächlich aus?

in Java ich eine benutzerdefinierte Klassen verwende die Argumente Bedingungen usw. gegeben sind, wandeln sie SQL-Anweisungen und lädt dann die Ergebnisse auf die Objekte in das Modell des Projekts

Was von Ich bin nicht sicher ist, ob Linq a bessere Option zum Filtern solcher Daten.

Zum Beispiel, was gerade geschehen würde, ist somethng entlang dieser Linien

List<Customer> customers = (new CustomerDAO()).get_all() 

Oder wenn ich eine Bedingung

haben
List<Customer> customers = (new CustomerDAO()).get(new Condition(CustomerDAO.Code, equals, "code1") 

Nehmen wir nun an ich die Klassen C# übertragen haben und ich möchte mach etwas Ähnliches wie im zweiten Fall.

So werde ich wohl etwas entlang der Linien von schreiben:

var customers = from customer 
    in (new CustomerDAO()).get_all() 
    where customer.code.equals("code1") 
    select customer 

Ich weiß, dass die Abfrage nur dann ausgeführt werden, wenn ich den Zugriff auf Kunden tatsächlich versuchen, aber wenn ich mehrere Zugriffe auf Kunden (lassen Sie uns sag, dass ich später 4 foreach loops verwende) wird die get_all Methode 4 mal aufgerufen? oder werden die Ergebnisse bei der ersten Ausführung gespeichert?

Auch ist es effizienter (zeitweise weil Speicher wahrscheinlich ist es nicht), nur die get_all() -Methode zu behalten und linq verwenden, um die Ergebnisse zu filtern? Oder benutze mein bestehendes Setup, das in der Tat

ausführt Und lädt die Ergebnisse auf ein Objekt?

Vielen Dank im Voraus für jede Hilfe können Sie

bearbeiten bieten: ja ich weiß es sqlite.net die so ziemlich das tut, was mein daos tun, aber wahrscheinlich besser, und irgendwann ist, werde ich wahrscheinlich konvertieren alle meine Objekte, es zu benutzen, ich brauche nur um

+0

Auf welche LINQ beziehen Sie sich? LINQ zu Objekten? LINQ zu EF? LINQ zu SQL? –

+0

Ja, das Dao erstellt Liste Cruces

Antwort

4

zu wissen, zu wissen, ob ich mehrere Zugriffe auf die Kunden haben (lassen uns sagen, dass ich 4 foreach verwenden später Schleifen) wird die get_all Methode 4 genannt werden mal? oder werden die Ergebnisse bei der ersten Ausführung gespeichert? irgendwo

Jedes Mal, wenn Sie die Enumerator aufzählen (mit foreach in Ihrem Beispiel), wird die Abfrage erneut auszuführen, wenn Sie das materialisierte Ergebnis speichern. Wenn zum Beispiel auf der ersten Abfrage würden Sie tun:

var customerSource = new CustomerDAO(); 
List<Customer> customerSource.Where(customer => customer.Code.Equals("code1")).ToList(); 

Dann jetzt werden Sie mit einem In-Memory arbeiten List<Customer> ohne die Abfrage immer wieder ausgeführt wird.

Im Gegenteil, wenn jedes Mal, wenn Sie tun würde:

var filteredCustomers = customerSource.Where(customer => customer.Code.Equals("code1")) 
foreach (var customer in filteredCustomers) 
{ 
    // Do stuff 
} 

dann für jede Aufzählung finden Sie die die Abfrage immer wieder werden exeucting.

Auch ist es effizienter, (Zeit weise, weil der Speicher weise ist es wahrscheinlich nicht) zu halten gerade die get_all() Methode und die Verwendung von Linq die Ergebnisse zu filtern? Oder benutze mein bestehendes Setup, das in Wirklichkeit

ausführt Das hängt wirklich von Ihrem Anwendungsfall ab. Stellen wir uns vor, Sie verwenden LINQ to EF, und die Kundentabelle hat eine Million Zeilen. Möchten Sie wirklich alle in den Speicher bringen und sie dann nur herausfiltern, um eine Teilmenge von Daten zu verwenden? In der Regel wäre es besser, eine gefilterte Abfrage vollständig durchzuführen.

+1

So ist es entweder die process einmal bevor jemals die Ergebnisse benötigen, oder die Durchführung jedes Mal, wenn ich sie brauche, denke ich muss zwischen Leistung über Speicherauslastung wählen, danke für die Antwort – Cruces

+0

@Cruces Es ist nicht so einfach und einfach - es sei denn, Sie wissen nicht, was Datenbanken tun. Wenn Sie 64 Millionen Kunden haben und den kby-Namen sehen und die Tabelle im Server einen Index für den Namen hat, ist es auch viel schneller, den Datenbankserver nach einem Array zu fragen. Die Implementierung Ihrer eigenen in der Speicherdatenbank ist eine ganz andere Sache, als LINQ to Objects nur über eine in Memory Collection laufen zu lassen. Der Kompromiss ist also nicht so trivial wie Sie es machen. Und was ist mit Updates für diese Kunden? Wie laden Sie sie neu? ;) – TomTom

+0

Nein ich arbeite nicht mit diesen großen Datenbanken, die meisten Tabellen haben nicht mehr als 400k Einträge, aber ich sehe Ihren Punkt, ich page normalerweise Daten, wenn es zu viele Zeilen gibt. Ich war nur herumwandern, was der Effekt wäre Sei, wenn ich etwas suchen muss, dessen Größe ich kenne (zum Beispiel hat meine Postleitzahl-Tabelle ungefähr 100 Einträge und wird wahrscheinlich nie mehr als 200 erreichen). Normalerweise arbeite ich mit Prototypen solcher Daten, ich war nur am wandern, wenn es besser wäre, sie an Ort und Stelle zu laden, weil selbst das Prototyp-Muster einige Probleme hat. – Cruces

Verwandte Themen