c# - 有条件地获取关联实体避免 SELECT N+1 问题

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

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

基本上我想访问 EmployeeEmployeeDetailsInCompany 我在 Position 实体中。目前我必须遍历我在 Employee 上的列表并找到 EmployeeDetailsInCompanyCompany.Id 与我的 Company 实体。这是因为 Position 仅对特定 Company 的特定 Employee 有效,所以这就是 EmployeeDetailsInCompany 的位置进来。

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

是否可以重写这些关联,这样我就不会陷入 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/

相关文章:

c# - 如何 XML 序列化对象列表数组?

java - Hibernate Multi-Tenancy : change tenant in session

c# - 城堡 ActiveRecord 3 : ActiveRecordLinq queries using Equals not work

c# - 与 NHibernate 的一对一映射/使用实体作为 PK

c# - 覆盖Unity中的标准关闭按钮

c# - 使用 Json.NET 解析 Json 字符串

将控件添加到窗体时,应用程序的 C# 加载项(通过 COM)卡住?

java - BeanUtils.copyProperties() 在 Tomcat 上使用时抛出 NullPointerException

hibernate - 如何在 hibernate 条件中编写insertinto命令

带有 Or 子查询的 NHibernate QueryOver