我有一个父类,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吗?
答案 0 :(得分:1)
取消Fetch.Join
并使用批处理,从我的记忆中使用BatchSize
HasMany(x => x.Children).KeyColumn("ParentId").BatchSize(25);
正如您所知,如果您使用分页,则获取连接无用,因为您将获得笛卡尔积(重复)