c# - 避免使用 NHibernate 实体列表进行 N+1 选择

标签 c# nhibernate nhibernate-mapping

我收到一个 NHibernate 实体列表,这些实体是通过我无法修改的代码检索的。我想从子实体中为列表中的每个项目选择一个属性,但它正在为每个项目生成一个新的选择。

如何在不更改生成传入实体的查询或更改映射(这两者都会对不相关的代码产生影响)的情况下获取子资源。理想情况下,我也不必在代码的这一层创建自定义查询。

这是一个示例。我的实体:

public class Property {
    public IList<Room> Rooms { get; set; }
}
public class Room {
    public Template Template { get; set; }
}
public class Template {
    public string Name { get; set; }
}

我正在调用的函数:

public IEnumerable<string> GetTemplateNames(Property property) {
    return property.Rooms.Select(room => room.Template.Name).Distinct();
}

最佳答案

我在每个集合(以及每个类)上使用batch-size设置。在这里查看更多内容:

NHibernate Criteria with Distinct Parent Load All Children?

如果是 xml 映射,请将其添加到您的包中

<bag name="Rooms" ... batch-size="50">

NHibernate 将批量加载所有已加载父项的集合(在上述情况下为 Property)...因此,我们将得到 1,而不是 1 + N + N/50

关于c# - 避免使用 NHibernate 实体列表进行 N+1 选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38297825/

相关文章:

c# - vb 到 c# 日期相关问题 (DateAdd & DateInterval)

nhibernate - 使用 NHibernate 接收超出范围的索引

java - 如何在表中添加两个主键?

n :n relatinship 中的 NHibernate 映射

c# - WPF MVVM依赖属性获取负值

c# - 在 XNA 中绘制二维曲线

c# - 如何将零件焊接到 Orchard CMS 中的管理页面

c# - 如何为 NHibernate for MySQL MD5 设置标准?

NHibernate 实体和多重关联

performance - NHibernate插入具有代理关联的实体而不获取