我收到一个 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/