Cliente vs. Avaliação do servidorClient vs. Server Evaluation

Entity Framework Core dá suporte a partes da consulta que está sendo avaliada no cliente e partes do que está sendo enviada por push para o banco de dados.Entity Framework Core supports parts of the query being evaluated on the client and parts of it being pushed to the database. Cabe o provedor de banco de dados para determinar quais partes da consulta serão avaliadas no banco de dados.It is up to the database provider to determine which parts of the query will be evaluated in the database.

Dica

Você pode exibir este artigo exemplo no GitHub.You can view this article's sample on GitHub.

Avaliação do clienteClient evaluation

No exemplo a seguir, um método auxiliar é usado para padronizar URLs para blogs que são retornados de um banco de dados do SQL Server.In the following example a helper method is used to standardize URLs for blogs that are returned from a SQL Server database. Como o provedor do SQL Server não tem nenhuma informação sobre como esse método é implementado, não é possível para traduzi-lo em SQL.Because the SQL Server provider has no insight into how this method is implemented, it is not possible to translate it into SQL. Todos os outros aspectos da consulta são avaliados no banco de dados, mas passando retornado URL por esse método é executado no cliente.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;
}

Desabilitando a avaliação do clienteDisabling client evaluation

Durante a avaliação do cliente pode ser muito útil, em alguns casos, isso poderá resultar em um baixo desempenho.While client evaluation can be very useful, in some instances it can result in poor performance. Considere a consulta a seguir, onde o método auxiliar agora é usado em um filtro.Consider the following query, where the helper method is now used in a filter. Como isso não pode ser executado no banco de dados, todos os dados são extraídos na memória e, em seguida, o filtro é aplicado no cliente.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. Dependendo da quantidade de dados, e a quantidade de dados é filtrado, isso pode resultar em baixo desempenho.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();

Por padrão, o EF Core registrará um aviso quando a avaliação do cliente é executada.By default, EF Core will log a warning when client evaluation is performed. Consulte log para obter mais informações sobre como exibir a saída de log.See Logging for more information on viewing logging output. Você pode alterar o comportamento quando a avaliação do cliente ocorre para gerar ou não faça nada.You can change the behavior when client evaluation occurs to either throw or do nothing. Isso é feito ao configurar as opções para o contexto - normalmente em DbContext.OnConfiguring, ou em Startup.cs se você estiver usando o 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));
}