簡體   English   中英

有條件地獲取關聯實體避免 SELECT N+1 問題

[英]Conditionally fetching associated entity avoiding SELECT N+1 problems

假設我有以下域:

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實體中擁有的EmployeeDetailsInCompanyEmployee 目前,我必須遍歷我在Employee上的列表,並找到Company.Id與我的Company實體相匹配的EmployeeDetailsInCompany 這是因為Position僅對某個Company的某個Employee有效,所以這就是EmployeeDetailsInCompany進入的地方。

這里最好的選擇是在PositionEmployeeDetailsInCompany之間建立關聯,但這是不可能的,因為該表上的數據可能會發生變化(例如,公司可能決定清除其所有員工詳細信息並再次加載新數據)。

是否可以重寫這些關聯,這樣我就不會陷入 SELECT N+1 問題(現在我必須遍歷列表,這種情況正在發生)? 我該如何更改它,以便更輕松地找到我想要的詳細信息,而不會有太多麻煩?

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

如果您還沒有這樣做,請閱讀參考文檔中有關提高性能的章節。 我認為特別是關於批量獲取的部分是相關的。 這意味着當您請求其中之一時,NHibernate 可以一次性獲取幾個可能有趣的數據庫行。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM