1

Ich entwickle ein Asp.Net mvc Projekt mit Entity Framework Code First Approach. Aber ich versuche, die Leistung meiner Anwendung zu verbessern. Ich bin nicht klar, dass Entity Framework Datenbankabfrage erneut ausführen oder nicht, wenn ich wieder auf die gleiche Bedingung zugreifen. Bitte sehen Sie mein Szenario unten.Führt Entity Framework die Datenbankabfrage erneut für die bereits ausgeführte Abfrage aus?

Wie Sie im Code sehen können, wird eine neue Abfrage ausgeführt, um das Startdatum der Aktion abzurufen. Aber wenn ich Enddatum abrufe, wird die Datenbank die Abfrage erneut ausführen, auch wenn sie dieselbe Abfrage sind. Bitte erkläre mich. Ich bin damit verwirrt.

Antwort

3

Während die Antwort richtig ist, gibt es eine weitere Option

Ihre ursprüngliche Abfrage

var item = context.Items.FirstOrDefault();// Database query will be run for this 
var start = item.Promotions.FirstOrDefault().Start; // Another query will be run for this 
var end = item.Promotions.FirstOrDefault().End; //Will another query be run again? Same query is run again for this 
var price = item.Promotions.FirstOrDefault().Price; //Here also 

Laden Artikel zu betrachten als Objekt stoppt Daten aus dem Objekt zu lesen

var item = context.Items.FirstOrDefault();// Database query will be run for 

Nun sind alle Objekte geladen werden im Speicher gehalten, um von zu lesen, ohne eine Abfrage zu erzeugen

item.Description 
item.Items //etc 

nun Daten zu erhalten, wenn Sie verzögertes Laden sind, ist var Förderung = item.Promotions.FirstOrDefault() Und das wird eine weitere Abfrage

promotion.Start 
promotion.End 

Die Frage produzieren, wenn Sie die Förderung jedes Mal lesen, wäre es besser sein, um es mit der Abfrage enthalten (eifrig Laden verwenden) so, wenn das das Objekt geholt wird, ist es, das Kind Objekt

var item = context.Items.Include(x=>x.Promotions).FirstOrDefault(); 

und lädt dann wird es nur eine Abfrage dB-Daten über das Produkt zu erhalten und Th e Förderung.

Spezifische Auswahl

Sie auch die Abfrage aktualisieren können nur die Elemente auszuwählen, die Sie interessieren, indem Sie:

var customObj = context.Promotions.Where(p=>p.ItemId==itemId).Select(x=>new{x.Start, x.End, x.Price}).FirstOrDefault(); 

Und auf diese Weise erhalten Sie die spezifischen Auswahl erhalten und es werden spezifische Abfrage generieren für dich.

Hinweis Verwendung von SQL Profiler/Ameisen Profiler etc, um zu sehen, welche SQL-Sie generieren.

+0

Also ich wie dieses context.Items.Include abrufen (x => x.Promotions). Dann erhalte ich einen Gegenstand wie diesen var item = items.FirstOrDefault(). Wenn U auf item.Promotions.FirstOrDefault() zugreift, wird die Abfrage erneut ausgeführt? –

+0

Nein, es wird standardmäßig alle Instanzen enthalten, die mit dem Element – cpoDesign

+0

verknüpft sind. Was ist, wenn eine Beziehung besteht? Beispiel var item = context.items.FirstOrDefault(); var start = item.Promotion.Start; var end = item.Promotion.End. Wie Sie sehen können, habe ich sie nicht im Cache einer Variablen zugewiesen. Also eine weitere Abfrage erneut ausgeführt, wenn ich Promotion Enddatum abrufe? –

1

Die Daten in der Datenbank können sich inzwischen geändert haben, deshalb führt EF die Abfrage erneut aus.

die Leistung zu verbessern, einfach das Ergebnis selbst cachen:

var item = context.Items.FirstOrDefault(); // Database query will be run for this 
var promotion = item.Promotions.FirstOrDefault(); // Another query will be run for this 
var start = promotion.Start; // No additional query 
var end = promotion.End;  // No additional query 
var price = promotion.Price; // No additional query 

BTW: Das hat nichts mit Lazy Loading-zu tun. Lazy Loading bezieht sich auf das mühsame Laden anderer Entitäten, auf die es verweist. Es hängt nicht mit seinen Daten zusammen.

+0

Vielen Dank. –

+0

Was ist, wenn die Beziehung eins zu eins ist? Beispiel var item = context.items.FirstOrDefault(); var start = item.Promotion.Start; var end = item.Promotion.End.Wie Sie sehen können, habe ich sie nicht im Cache einer Variablen zugewiesen. Also eine weitere Abfrage erneut ausgeführt, wenn ich Promotion Enddatum abrufe? –

Verwandte Themen