Klient programu vs. Ocena serweraClient vs. Server Evaluation

Entity Framework Core obsługuje części zapytania Trwa obliczanie na urządzeniu klienckim i części wypychania do bazy danych.Entity Framework Core supports parts of the query being evaluated on the client and parts of it being pushed to the database. Jest dostawca bazy danych, aby określić części zapytania, które zostanie obliczone w bazie danych.It is up to the database provider to determine which parts of the query will be evaluated in the database.

Porada

Przykład użyty w tym artykule można zobaczyć w witrynie GitHub.You can view this article's sample on GitHub.

Oceny klientaClient evaluation

W poniższym przykładzie metoda pomocnika służy do standaryzacji adresy URL dla blogów, z którego są zwracane z bazy danych programu SQL Server.In the following example a helper method is used to standardize URLs for blogs that are returned from a SQL Server database. Ponieważ dostawca programu SQL Server nie wgląd w jaki sposób ta metoda jest implementowana, nie jest możliwe tłumaczenie SQL.Because the SQL Server provider has no insight into how this method is implemented, it is not possible to translate it into SQL. Wszystkie inne aspekty zapytania są oceniane w bazie danych, ale przekazywanie zwracanego URL za pośrednictwem tej metody jest wykonywane na komputerze klienckim.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;
}

Problemy z wydajnością oceny klientaClient evaluation performance issues

Oceny klienta mogą być bardzo przydatne, w niektórych przypadkach go może spowodować obniżenie wydajności.While client evaluation can be very useful, in some instances it can result in poor performance. Należy wziąć pod uwagę następujące zapytanie, której metody pomocnika teraz jest używane w filtrze.Consider the following query, where the helper method is now used in a filter. Ponieważ to nie może zostać wykonana w bazie danych, wszystkie dane są pobierane do pamięci, a następnie filtr jest stosowany na komputerze klienckim.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. W zależności od ilości danych, a ilość tych danych jest odfiltrowana może to spowodować spadek wydajności.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();

Rejestrowanie oceny klientaClient evaluation logging

Domyślnie program EF Core będzie rejestrować ostrzeżenie podczas oceny klienta jest wykonywane.By default, EF Core will log a warning when client evaluation is performed. Zobacz rejestrowania więcej informacji na temat wyświetlania danych wyjściowych rejestrowania.See Logging for more information on viewing logging output.

Zachowanie opcjonalne: zgłoszenie wyjątku dla oceny klientaOptional behavior: throw an exception for client evaluation

Można zmienić zachowanie w przypadku oceny klienta throw lub nic nie rób.You can change the behavior when client evaluation occurs to either throw or do nothing. Odbywa się podczas konfigurowania opcji kontekstu — zwykle w DbContext.OnConfiguring, lub Startup.cs korzystania z platformy 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));
}