代码检查:可能对相关实体的数据库进行多次查询(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
}
}
为了解决此问题,ReSharper 建议使用 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
}
}
如果导航属性调用链更长,快速修复将根据需要添加 然后包含:
// 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月 27日