EmployeeDetailsInCompany

EmployeeDetailsInCompany

假设我有以下域:

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


(请注意,这是一个非常简化的版本,使问题更易于理解。)

基本上,我想访问EmployeeDetailsInCompany实体中的EmployeePosition。目前,我必须遍历Employee上的列表,找到EmployeeDetailsInCompany与我的Company.Id实体匹配的Company。这是因为Position仅对某个Employee上的某个Company有效,因此EmployeeDetailsInCompany进入该位置。

最好的选择是在PositionEmployeeDetailsInCompany之间建立关联,但这是不可能的,因为该表上的数据可以更改(例如,公司可能决定擦除其所有员工详细信息并再次加载新数据)。

是否可以重写这些关联,以免出现SELECT N + 1问题(现在必须循环遍历该列表)?我该如何更改它,以使其更轻松地找到想要的细节而又省事?

我已经考虑过在EmployeeDetailsInCompany上创建一个Position,可以使用公式对其进行映射,但这将为我提供一个只读列,而我试图避免使用HQL。

最佳答案

如果尚未阅读improving performance in the reference documentation章节,请阅读。我认为特别是有关批量提取的部分很重要。这意味着,NHibernate可以在您需要其中之一时一次性获取多个可能有趣的数据库行。

另一个选择是编写一个专门的查询,该查询将生成SQL以让DBMS完成工作。

08-27 14:05