假设我有以下域:
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;
}
(请注意,这是一个非常简化的版本,以使问题更容易理解。)
基本上我想访问 Employee
的 EmployeeDetailsInCompany
我在 Position
实体中。目前我必须遍历我在 Employee
上的列表并找到 EmployeeDetailsInCompany
其 Company.Id
与我的 Company
实体。这是因为 Position
仅对特定 Company
的特定 Employee
有效,所以这就是 EmployeeDetailsInCompany
的位置进来。
这里最好的选择是在 Position
和 EmployeeDetailsInCompany
之间建立关联,但这是不可能的,因为该表上的数据可能会改变(例如,公司可能决定清除其所有员工详细信息并再次加载新数据)。
是否可以重写这些关联,这样我就不会陷入 SELECT N+1 问题(现在我必须遍历列表,这正在发生)?我该如何更改它才能更轻松地找到我想要的详细信息?
我考虑过在 Position
上创建一个 EmployeeDetailsInCompany
,它将使用公式进行映射,但这会给我一个只读列,我正试图避免使用 HQL。
最佳答案
阅读关于 improving performance in the reference documentation 的章节如果你还没有这样做。我认为尤其是关于批量获取的部分是相关的。这意味着当您请求其中之一时,NHibernate 可以一次获取多个可能感兴趣的数据库行。
另一种选择是编写专门的查询来生成 SQL 以让 DBMS 完成工作。
关于c# - 有条件地获取关联实体避免 SELECT N+1 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34775647/