我们正在尝试为分页编写查询,我们希望使用Fetch来急切加载对象的集合,然后返回该对象的分页列表。下面的查询不起作用,因为当我们查看探查器时,它会跳过Skip and Take设置,只返回对象列表(急切加载):
var result = _repostitory.All<MediaFile>()
.Skip(10)
.Take(10)
.Fetch(mf => mf.Tags);
所有内容都会编译并执行但是,跳过和取消部分将被忽略,并且所有数据都将被恢复。是否可以将Fetch与Skip和Take一起使用进行分页?
答案 0 :(得分:2)
您是否尝试过跳过之前调用fetch并执行
var result = _repostitory.All<MediaFile>()
.Fetch(mf => mf.Tags)
.Skip(10)
.Take(10);
从我记忆中NH无法处理加入渴望加载的查询限制(它与SQL而不是NH有关)。它可能适用于子选择。
**更新
考虑这个例子
TableA
-------------
Id|Value
-------------
1 |Value1
2 |Value2
3 |Value3
TableB
-------------------------
ChildId|ParentId|ChildValue
-------------------------
1 | 1|Value1
2 | 1|Value2
3 | 2|Value3
4 | 2|Value4
5 | 3|Value5
6 | 3|ValueA
7 | 3|ValueA
8 | 3|ValueA
SELECT * FROM TableA LEFT JOIN TableB ON TableA.Id = TableB.ParentId
Result
--------------------------------------
Id|Value |ChildId|ParentId|ChildValue
--------------------------------------
1 |Value1|1 | 1|Value1
1 |Value1|2 | 1|Value2
2 |Value1|3 | 2|Value3
2 |Value1|4 | 2|Value4
3 |Value1|5 | 3|Value5
3 |Value1|6 | 3|ValueA
3 |Value1|7 | 3|ValueA
3 |Value1|8 | 3|ValueA
SELECT TOP 2 * FROM TableA LEFT JOIN TableB ON TableA.Id = TableB.ParentId
Result
--------------------------------------
Id|Value |ChildId|ParentId|ChildValue
--------------------------------------
1 |Value1|1 | 1|Value1
1 |Value1|2 | 1|Value2
因此.Take(2)将返回一个带有两个孩子的对象(Id 1)。您希望将前两个对象(Id 1,2)与其子项一起返回的位置。