避免N + 1选择NHibernate实体列表

时间:2016-07-11 01:00:44

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

1 个答案:

答案 0 :(得分:3)

我在每个集合(以及每个类)上使用 batch-size 设置。点击此处查看更多信息:

NHibernate Criteria with Distinct Parent Load All Children?

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

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

NHibernate将为所有已加载的父项(在上述情况中为Property批量加载集合...所以我们将获得1 + N / 1 + N而不是1 + N 50