2017-12-06 1 views
1

私は自分のアプリケーションを調べていますが、IQueryableの一部だけが実際にSQLクエリに変換され、残りの作業メモリ内で行われます。EFコアがメモリ内のIQueryableオペレーションの一部を実行する必要があるときを検出する方法

私は、開発者が思いついて使用可能なSQLクエリに変換する可能性のあるすべての式を説明する方法がないことを理解していますが、IIRC、EFは例外をスローしますIQueryableに定義されているすべての操作をSQLに変換します。

EFコアにも例外がスローされるか、少なくともIQueryableをSQLに完全に変換できない場合にイベントを発生させる方法はありますか?

+1

参照[サーバー評価対クライアント](https://docs.microsoft.com/en-us/ef/core/querying/ client-eval) - **クライアント評価の無効化**ドキュメントのトピック - 説明と例私は追加できるものはないと思う。 –

+1

@イワン、これを答えとして書いてください。正しいとマークします。それはまさに私が探しているものです!私が検索している間に見つけられなかったのは、アプリサーバーとデータベースサーバーをクライアントとサーバーの両方で考えるのではないと思うからです。 –

答えて

3

EFコアにも例外がスローされる方法がありますか、少なくともIQueryableをSQLに変換できない場合はイベントを発生させる方法はありますか?

確かに。まず、これはpre EF Core(EF6.x)に存在しないクライアント評価と呼ばれるEFコアの概念です。これは、Client vs. Server Evaluationドキュメントのトピックで覆われており、は、クライアントの評価を無効にセクションでは、デフォルトの動作を説明し、それを変更することができます方法は次のとおりです。クライアントの評価が行われた場合

デフォルトでは、EFコアは警告をログに記録します。ログ出力の表示の詳細については、Loggingを参照してください。クライアントの評価が発生した場合や、何もしない場合に動作を変更することができます。これは、ASP.NETコアを使用している場合は、通常はDbContext.OnConfiguring、またはStartup.csにコンテキストのオプションを設定するときに行われます。

後はRelationalEventId.QueryClientEvaluationWarningためDbContextOptionsBuilderクラスのConfigureWarnings方法を使用することによって達成されます。有効なアクションがあるLog(デフォルト)、IgnoreThrowは(希望):

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) 
{ 
    // ... 
    optionsBuilder.ConfigureWarnings(warnings => 
     warnings.Throw(RelationalEventId.QueryClientEvaluationWarning)); 
} 
関連する問題