使用连接时,使用nhibernate停止重复的子项或n + 1

时间:2014-05-28 16:23:22

标签: c# nhibernate fluent-nhibernate

我有一个父类,HasMany孩子的映射:

HasMany(x => x.Children).KeyColumn("ParentId");

存储库功能如下:

Parent parent = null;
Child child = null;

var query = Session.QueryOver(() => parent )
.JoinAlias(() => parent.Children, () => child , JoinType.InnerJoin)
.TransformUsing(Transformers.DistinctRootEntity).Skip(skip).Take(25).List();

哪种方法可以正常工作,除非它从父母访问时触发多次调用以选择子项。

我不想要多次数据库命中,因此我将代码更改为:

 HasMany(x => x.Children).KeyColumn("ParentId").Fetch.Join();

并完全删除了连接别名,除了父级在select中多次出现外,它同样正常工作。例如,这些是从生成的选择查询返回的sql行:

ParentId | ChildId
123      |1
123      |1
124      |2
125      |1

但它将对象输出为父对象,其中id为123出现两次(这是正确的),但两者都有四个id为1的孩子(这是错误的,只有一个孩子)

我的问题是你有一个没有n + 1的HasMany吗?

1 个答案:

答案 0 :(得分:1)

取消Fetch.Join并使用批处理,从我的记忆中使用BatchSize

HasMany(x => x.Children).KeyColumn("ParentId").BatchSize(25);

正如您所知,如果您使用分页,则获取连接无用,因为您将获得笛卡尔积(重复)