Entity Framework Core と LINQ の使用について質問があります。テーブルにアクセスしながら、他のテーブルの詳細を取得したいと思いますClients
。以下のコードを使用して取得できます。結合する必要があるテーブルは合計で約 10 個ありますが、この場合、以下のアプローチが適切でしょうか、それとも他のより優れたアプローチでしょうか。ClientId
すべてのテーブルの外部キーです。
実際、以下のような警告が出ています
[09:34:33 警告] Microsoft.EntityFrameworkCore.Query 'Include' または投影を介して複数のコレクション ナビゲーションの関連コレクションを読み込むクエリをコンパイルしていますが、'QuerySplittingBehavior' が構成されていません。既定では、Entity Framework は 'QuerySplittingBehavior.SingleQuery' を使用するため、クエリのパフォーマンスが低下する可能性があります。https://go.microsoft.com/fwlink/?linkid=2134277詳細については、この警告を引き起こしているクエリを識別するには、「ConfigureWarnings(w => w.Throw(RelationalEventId.MultipleCollectionIncludeWarning))」を呼び出します。
コード:
var client = await _context.Clients
.Include(x => x.Address)
.Include(x => x.Properties)
.Include(x => x.ClientDetails)
-------------------
-------------------
-------------------
-------------------
.Where(x => x.Enabled == activeOnly && x.Id == Id).FirstOrDefaultAsync();
ベストアンサー1
実際に Eager ローディング ( を使用include()
) を使用する場合、左結合 (必要なすべてのクエリを 1 つのクエリで) を使用してデータを取得します。これは、ef 5 での ef の動作のデフォルトです。クエリで分割して、すべてのインクルードを別々のクエリに分割するように設定できますAsSplitQuery()
。次のようになります。
var client = await _context.Clients
.Include(x => x.Address)
.Include(x => x.Properties)
.Include(x => x.ClientDetails)
-------------------
-------------------
-------------------
-------------------
.Where(x =>x.Id == Id).AsSplitQuery().FirstOrDefaultAsync()
このアプローチでは、より多くのデータベース接続が必要になりますが、それほど重要なことではありません。最終的な推奨事項としては、AsNoTracking()
高パフォーマンスのクエリに使用することをお勧めします。