有条件地获取关联实体,避免选择 N+1 问题
本文关键字:选择 N+1 问题 获取 关联 实体 有条件 | 更新日期: 2023-09-27 18:30:16
假设我有以下域:
public class Company
{
public long Id;
}
public class EmployeeDetailsInCompany
{
public long Id;
public Company Company;
}
public class Employee
{
public long Id;
public List<EmployeeDetailsInCompany> EmployeeDetailsInCompany;
}
public class Position
{
public long Id;
public Employee Employee;
public Company Company;
}
(请注意,这是一个非常简化的版本,使问题更容易理解。
基本上,我想访问我在Position
实体中拥有的Employee
的EmployeeDetailsInCompany
。目前,我必须遍历Employee
上的列表,并找到Company.Id
与我的Company
实体匹配的EmployeeDetailsInCompany
。这是因为Position
只对某个Company
的特定Employee
有效,所以这就是EmployeeDetailsInCompany
进入的地方。
这里最好的选择是在Position
和EmployeeDetailsInCompany
之间建立关联,但这是不可能的,因为该表上的数据可能会更改(例如,公司可能决定清除所有员工详细信息并再次加载新数据)。
是否可以重写这些关联,这样我就不会陷入 SELECT N+1 问题(现在我必须循环浏览列表)?我怎样才能更改它以更轻松地找到我想要的详细信息而不会遇到太多麻烦?
我已经考虑过在Position
上创建一个使用公式映射的EmployeeDetailsInCompany
,但这会给我一个只读列,我正在尝试避免 HQL。
如果您尚未阅读参考文档中有关提高性能的章节,请阅读该章节。我认为特别是关于批量获取的部分是相关的。这意味着当您请求其中一个时,NHibernate可以一次性获取几个可能感兴趣的数据库行。
另一种选择是编写一个专门的查询,该查询将生成 SQL 以让 DBMS 完成工作。