2

我们有一个尝试为分页编写的查询,我们希望使用 Fetch 为一个对象预先加载一个集合,然后返回该对象的分页列表。下面的查询不起作用,因为当我们查看分析器时,它会跳过 Skip 和 Take 设置,只返回对象列表(急切加载):

var result = _repostitory.All<MediaFile>()
            .Skip(10)
            .Take(10)
            .Fetch(mf => mf.Tags);

一切都编译并执行,但是跳过和执行部分被忽略,所有数据都被带回。是否可以将 Fetch 与 Skip 和 Take 结合使用进行分页?

4

1 回答 1

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)及其子对象的位置。

于 2011-08-08T19:11:02.347 回答