Évaluation sur le client ou le serveurClient vs. Server Evaluation

Entity Framework Core prend en charge l’évaluation de parties de la requête sur le client et l’envoi de parties de celle-ci vers la base de données.Entity Framework Core supports parts of the query being evaluated on the client and parts of it being pushed to the database. Il incombe au fournisseur de base de données de déterminer les parties de la requête qui seront évaluées dans la base de données.It is up to the database provider to determine which parts of the query will be evaluated in the database.

Conseil

Vous pouvez afficher cet exemple sur GitHub.You can view this article's sample on GitHub.

Évaluation sur le clientClient evaluation

Dans l’exemple suivant, une méthode d’assistance est utilisée afin de normaliser les URL pour les blogs qui sont retournés à partir d’une base de données SQL Server.In the following example a helper method is used to standardize URLs for blogs that are returned from a SQL Server database. Étant donné que le fournisseur SQL Server n’a pas connaissance de la façon dont cette méthode est implémentée, il n’est pas possible de la traduire en SQL.Because the SQL Server provider has no insight into how this method is implemented, it is not possible to translate it into SQL. Tous les autres aspects de la requête sont évalués dans la base de données, mais la transmission de la valeur URL retournée via cette méthode est exécutée sur le client.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;
}

Désactivation de l’évaluation du clientDisabling client evaluation

Si l’évaluation sur le client peut être très utile, dans certains cas, cela peut entraîner une dégradation des performances.While client evaluation can be very useful, in some instances it can result in poor performance. Considérez la requête suivante, où la méthode d’assistance est maintenant utilisée dans un filtre.Consider the following query, where the helper method is now used in a filter. Étant donné que cela ne peut pas être effectué dans la base de données, toutes les données sont extraites en mémoire, puis le filtre est appliqué sur le client.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. Selon la quantité de données et la mesure dans laquelle ces données sont filtrées, cela peut entraîner une dégradation des performances.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();

Par défaut, EF Core consigne un avertissement lorsque l’évaluation sur le client est effectuée.By default, EF Core will log a warning when client evaluation is performed. Consultez Journalisation pour plus d’informations sur l’affichage de la sortie de la journalisation.See Logging for more information on viewing logging output. Vous pouvez modifier le comportement lorsque l’évaluation sur le client survient, entre journaliser ou ne rien faire.You can change the behavior when client evaluation occurs to either throw or do nothing. Cette opération est effectuée lors de la définition des options pour votre contexte, généralement dans DbContext.OnConfiguring, ou Startup.cs si vous utilisez 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));
}