Auswertung (Client & Server)
Die Client vs. Server-Bewertung ist eine Funktion, die das Schreiben von Abfragen in die Datenbank vereinfacht, da Entity Framework Core die Auswertung von Teilen der Abfrage auf dem Client und von Teilen der Abfrage in die Datenbank unterstützt.
- Es ist Sache des Datenbankanbieters, zu bestimmen, welche Teile der Abfrage in der Datenbank ausgewertet werden.
- Bei der Client / Server-Bewertung können Abfragen Logik enthalten, die nicht in der Datenbank ausgewertet werden kann und ausgewertet werden muss, nachdem die Daten in den Speicher abgerufen wurden.
Im folgenden Beispiel wird eine Hilfsmethode verwendet, um den Vornamen und Nachnamen aus einer SQL Server-Datenbank zu kombinieren.
private static string CombineNames(string firstName, string lastName)
{
return firstName + " " + lastName;
}
Der SQL Server-Anbieter hat keine Ahnung, wie diese Methode implementiert wird. Daher ist es nicht möglich, sie in SQL zu übersetzen. Alle anderen Aspekte der Abfrage werden in der Datenbank ausgewertet. Das Kombinieren des Vornamens und des Nachnamens über diese Methode wird jedoch auf dem Client durchgeführt.
var customer = context.Customers
.Where(c => c.CustomerId == 1)
.Select(cust => new
{
FullName = CombineNames(cust.FirstName, cust.LastName)
}).FirstOrDefault();
Die Client / Server-Bewertung verfügt über einige nützliche Funktionen, kann jedoch in einigen Fällen zu einer schlechten Leistung führen. In der folgenden Abfrage wird die Hilfsmethode jetzt in einem Filter verwendet, da dies nicht in der Datenbank ausgeführt werden kann.
var customers = context.Customers
.Where(c => CombineNames(c.FirstName, c.LastName)
.Contains("John"))
.ToList();
Alle Daten werden in den Speicher geladen und der Filter wird auf den Client angewendet. Je nach Datenmenge und wie viel dieser Daten herausgefiltert wird, kann dies zu einer schlechten Leistung führen.
- Standardmäßig protokolliert EF Core eine Warnung, wenn eine Clientauswertung durchgeführt wird.
- Sie können das Verhalten in
DbContext.OnConfiguring
wenn eineDbContext.OnConfiguring
eintritt, um entweder eine AusnahmeDbContext.OnConfiguring
oder sie zu ignorieren.
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseSqlServer(@"Data Source=(localdb)\ProjectsV13;Initial Catalog=CustomerDB;")
.ConfigureWarnings(warnings => warnings.Throw(RelationalEventId.QueryClientEvaluationWarning));
}
Jetzt wird Konfiguration in DbContext.OnConfiguring
hinzugefügt, um eine Ausnahme DbContext.OnConfiguring
. Wenn eine schlecht funktionierende Abfrage gefunden wird, wird die folgende Ausnahme mit einer Warnung ausgelöst.
