2016-01-13 76 views
2

假設我有以下領域:有條件獲取相關實體避免選擇N + 1個問題

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

(請注意,這是一個非常簡化的版本,以使問題更容易理解。)

基本上我想訪問EmployeeDetailsInCompanyEmployee我有一個Position實體。目前,我必須遍歷我在Employee上的列表,並找到,它的Company.Id與我的Company實體相匹配。這是因爲Position只適用於在某一Company一定Employee,所以這也正是EmployeeDetailsInCompany得到英寸

這裏最好的辦法是將有PositionEmployeeDetailsInCompany之間的關聯,但這是不可能的,因爲該表上的數據可能會發生變化(例如,公司可能會決定清除所有員工的詳細信息並再次加載新數據)。

是否有可能重寫這些關聯,因此我不會陷入SELECT N + 1問題(現在正在發生,我必須循環訪問列表)?我怎麼能改變它,使它更容易找到我想要的細節,而沒有太多麻煩?

我曾考慮在Position上創建一個EmployeeDetailsInCompany,它將使用公式映射,但這會給我一個只讀列,我試圖避免HQL。

回答

1

如果您還沒有閱讀關於improving performance in the reference documentation的章節。我認爲特別是有關批量提取的部分是相關的。這意味着當您詢問其中一個數據庫時,NHibernate可以一次獲取幾個可能感興趣的數據庫行。

另一種選擇是編寫一個專門的查詢,該查詢將生成SQL以讓DBMS完成工作。

+0

批量讀取解決了我的問題,因爲一個'Employee'不可能有很多相應的'EmployeeDetailsInCompany'。 –