ReSharper 2025.3 ヘルプ

コード検査: データベースに対する複数のクエリの可能性 (N+1 問題)

このインスペクションは、コレクションを反復するときに不必要なデータベース呼び出しが行われる N+1 セレクト問題を検出します。

この問題は次の例で説明できます。ここでは、ProductsDetails が 2 つのデータベーステーブルであり、各 Product エントリが複数の Detail エントリにリンクされています。

// First DB query: get all 'Product' entries from the database var products = dbContext.Products; // Iterating 'Product' entries in memory foreach (var product in products) { // Accessing linked items with 'product.Details' // generates a new DB query for each 'Product', // which makes it N queries + the first query. foreach (var detail in product.Details) { // Do something } }

この問題を解決するために、ReSharper はエンティティフレームワークコアの Include 機能を使用することを提案しています。これにより、リンクされたすべての Detail エントリが最初のクエリで直接読み込まれます。

// Gets all 'Product' and all linked 'Detail' entries from the database var products = dbContext.Products.Include(x => x.Details); // Iterating 'Product' entries in memory foreach (var product in products) { // Accessing linked items with 'product.Details' in memory foreach (var detail in product.Details) { // Do something } }

ナビゲーションプロパティ呼び出しのチェーンが長い場合、クイックフィックスは必要に応じて ThenInclude を追加します。

// Gets all 'Product', all linked 'Detail', and all linked 'Line' entries from the database var products = dbContext.Products.Include(x => x.Details).ThenInclude(x => x.Lines); // Iterating 'Product' entries in memory foreach (var product in products) { // Accessing linked items with 'product.Details' in memory foreach (var detail in product.Details) { // Accessing linked items with 'detail.Lines' in memory foreach (var line in detail.Lines) { // Do something } } }
2024 年 2 月 11 日

関連ページ:

コードインスペクション設定を構成する

設計時コードインスペクションを構成する:デフォルトでは、ReSharper は、サポートされている言語に対応するすべてのファイルで設計時コードインスペクションを有効にします。必要に応じて、無効にすることができます。設計時コードインスペクションが有効かどうかに関係なく、コードインスペクションは常に特定のスコープで実行できます。メインメニューからを選択するか、Alt+R O を押してから、左側のを選択します。設計時コードインスペクションを切り替えるには、コード分析を有効にするチェックボックスを使用し...

EF 固有コードインスペクション

ReSharper は、エンティティフレームワークプロジェクトに固有のコードの問題に対して、次のコードインスペクションを提供します。データベース関数はデータベース以外のコンテキストで呼び出されてはなりません警告関数は SQL に変換できないため、データベースコンテキストで呼び出すことはできません警告データベースに対する複数のクエリの可能性 (N+1 問題) 警告関連エンティティに対するデータベースへの複数のクエリの可能性 (N+1 問題) 提案文字列の長さが無制限であることによって発生する可能性のあ...

コード検査: 関連エンティティに対するデータベースへの複数のクエリの可能性 (N+1 問題)

このインスペクションは、コレクションを反復するときに不必要なデータベース呼び出しが行われる N+1 セレクト問題を検出します。この問題は次の例で説明できます。ここでは、とが 2 つのデータベーステーブルであり、各エントリが複数のエントリにリンクされています。// First DB query: get all 'Product' entries from the database var products = dbContext.Products; // Iterating 'Product' e...