我们尝试编写一个用于分页的查询,其中我们希望使用 Fetch 预先加载对象的集合,然后返回该对象的分页列表。 下面的查询不起作用,因为当我们查看探查器时,它会跳过“跳过”和“获取”设置,只返回对象列表(热切加载):
var result = _repostitory.All<MediaFile>()
.Skip(10)
.Take(10)
.Fetch(mf => mf.Tags);
一切都会编译并执行,但是,跳过和采取部分将被忽略,所有数据都将被带回。是否可以将 Fetch 与 Skip 和 Take 结合使用进行分页?
您是否尝试过在跳过并采取之前调用 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) 及其子对象。