有条件地提取相关实体,避免SELECT N + 1问题

时间:2016-01-13 19:42:58

标签: c# hibernate nhibernate

假设我有以下域名:

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实体中Employee的{​​{1}}。目前,我必须遍历Position上的列表,并找到EmployeeEmployeeDetailsInCompany实体匹配的Company.Id。这是因为Company仅对某个Position上的某个Employee有效,因此Company可以进入。

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

是否有可能重写这些关联,所以我不会陷入SELECT N + 1问题(现在我必须在列表中循环)?我怎么能改变它以便更容易找到我想要的细节而不会有太多麻烦?

我考虑在EmployeeDetailsInCompany上创建EmployeeDetailsInCompany,使用公式进行映射,但这会给我一个只读列,并且我试图避免使用HQL。

1 个答案:

答案 0 :(得分:1)

如果您还没有这样做,请阅读improving performance in the reference documentation上的章节。我认为特别是关于批量提取的部分是相关的。这意味着当你要求其中一个时,NHibernate可以一次性获取几个可能有趣的数据库行。

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