クライアントとします。サーバーの評価Client vs. Server Evaluation

Entity Framework のコアには、クライアントとのデータベースにプッシュされる部分で評価されるクエリの一部がサポートされています。Entity Framework Core supports parts of the query being evaluated on the client and parts of it being pushed to the database. クエリのどの部分は、データベースで評価されるかどうか、データベース プロバイダーの責任です。It is up to the database provider to determine which parts of the query will be evaluated in the database.

ヒント

この記事を表示するサンプルGitHub でします。You can view this article's sample on GitHub.

クライアントの評価Client evaluation

次の例では、ヘルパー メソッドを SQL Server データベースから返されるブログの Url を標準化するために使用されます。In the following example a helper method is used to standardize URLs for blogs that are returned from a SQL Server database. SQL Server プロバイダーにこのメソッドを実装する方法に関する洞察があるないために、SQL に変換することはできません。Because the SQL Server provider has no insight into how this method is implemented, it is not possible to translate it into SQL. クエリの他のすべての側面が評価される、データベースで、渡す、返されたURLこのメソッドでは、クライアント上で実行されます。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;
}

クライアントの評価を無効にします。Disabling client evaluation

クライアントの評価は、場合によってはパフォーマンスが低下する可能性が非常に便利ですが。While client evaluation can be very useful, in some instances it can result in poor performance. ヘルパー メソッドが現在使用されているフィルターで、次のクエリを検討してください。Consider the following query, where the helper method is now used in a filter. これは、データベースで実行することはできません、ため、クライアントでデータがメモリとし、フィルターに取り込まれたすべてが適用されます。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. データ、およびそのデータの量はフィルターで除外額、に応じてこの結果、パフォーマンスが低下します。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();

既定では、クライアントの評価が実行されるときに、EF コアは警告を記録します。By default, EF Core will log a warning when client evaluation is performed. 参照してくださいログログ出力を表示する方法の詳細についてです。See Logging for more information on viewing logging output. スローまたは何もしないクライアントの評価が発生した場合は、動作を変更できます。You can change the behavior when client evaluation occurs to either throw or do nothing. では通常、コンテキストでのオプションを設定するときにこれは、 DbContext.OnConfiguring、またはStartup.csASP.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));
}