Client im Vergleich zu Server-EvaluierungClient vs. Server Evaluation

Entity Framework Core unterstützt Teile der Abfrage ausgewertet wird, auf dem Client und Teile davon per Push an die Datenbank übermittelt.Entity Framework Core supports parts of the query being evaluated on the client and parts of it being pushed to the database. Es liegt im Ermessen der Datenbankanbieter, um zu bestimmen, welche Teile der Abfrage in der Datenbank ausgewertet werden.It is up to the database provider to determine which parts of the query will be evaluated in the database.

Tipp

Sie können anzeigen, dass dieser Artikel Beispiel auf GitHub.You can view this article's sample on GitHub.

Client-EvaluierungClient evaluation

Im folgenden Beispiel wird eine Hilfsmethode verwendet, um URLs für Blogs zu standardisieren, die aus einer SQL Server-Datenbank zurückgegeben werden.In the following example a helper method is used to standardize URLs for blogs that are returned from a SQL Server database. Da SQL Server-Anbieter keine Einblick hat, wie diese Methode implementiert wird, ist es nicht möglich, die in SQL zu übersetzen.Because the SQL Server provider has no insight into how this method is implemented, it is not possible to translate it into SQL. Alle anderen Aspekte der Abfrage ausgewertet werden in der Datenbank, übergeben Sie jedoch das zurückgegebene URL über diese Methode auf dem Client ausgeführt wird.All other aspects of the query are evaluated in the database, but passing the returned URL through this method is performed on the client.

var blogs = context.Blogs
    .OrderByDescending(blog => blog.Rating)
    .Select(blog => new
    {
        Id = blog.BlogId,
        Url = StandardizeUrl(blog.Url)
    })
    .ToList();
public static string StandardizeUrl(string url)
{
    url = url.ToLower();

    if (!url.StartsWith("http://"))
    {
        url = string.Concat("http://", url);
    }

    return url;
}

Deaktivieren des Client-BewertungDisabling client evaluation

Auswertung der Client kann sehr nützlich sein, kann in einigen Fällen dies zu schlechten Leistungen führen.While client evaluation can be very useful, in some instances it can result in poor performance. Betrachten Sie die folgende Abfrage, wobei die Hilfsmethode jetzt in einem Filter verwendet wird.Consider the following query, where the helper method is now used in a filter. Da dies in der Datenbank ausgeführt werden kann, werden alle Daten in den Arbeitsspeicher, und klicken Sie dann den Filter gezogen werden auf dem Client angewendet.Because this can't be performed in the database, all the data is pulled into memory and then the filter is applied on the client. Abhängig vom Umfang der Daten, und wie viel dieser Daten herausgefiltert wird könnte dies zu schlechten Leistungen führen.Depending on the amount of data, and how much of that data is filtered out, this could result in poor performance.

var blogs = context.Blogs
    .Where(blog => StandardizeUrl(blog.Url).Contains("dotnet"))
    .ToList();

Standardmäßig protokolliert EF Core eine Warnung, wenn Client Auswertung ausgeführt wird.By default, EF Core will log a warning when client evaluation is performed. Finden Sie unter Protokollierung für Weitere Informationen zur Anzeige von Protokollausgaben.See Logging for more information on viewing logging output. Sie können das Verhalten beim Client Auswertung erfolgt, entweder auslösen oder Unternehmen Sie nichts ändern.You can change the behavior when client evaluation occurs to either throw or do nothing. Dies erfolgt, wenn Sie die Optionen für den Kontext - in der Regel in einrichten DbContext.OnConfiguring, oder im Startup.cs bei Verwendung von ASP.NET Core.This is done when setting up the options for your context - typically in DbContext.OnConfiguring, or in Startup.cs if you are using ASP.NET Core.

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
    optionsBuilder
        .UseSqlServer(@"Server=(localdb)\mssqllocaldb;Database=EFQuerying;Trusted_Connection=True;")
        .ConfigureWarnings(warnings => warnings.Throw(RelationalEventId.QueryClientEvaluationWarning));
}