JetBrains Rider 2025.2 Help

代码检查:可能对数据库进行多次查询(N+1 问题)

此检查会检测 N+1 Select问题,即在迭代集合时进行了不必要的数据库调用。

可以通过以下示例说明此问题,其中 产品详细信息 是两个数据库表,每个 产品 条目链接到多个 详细信息 条目。

// 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 } }

为了解决此问题,JetBrains Rider 建议使用 Entity Framework Core 的 包含 功能,这将在第一次查询中加载所有链接的 详细信息 条目:

// 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 } } }
最后修改日期: 2025年 9月 26日