在NH 3.1中调用Fetch会忽略Skip和Take

时间:2011-08-08 19:04:02

标签: nhibernate c#-4.0 paging linq-to-nhibernate nhibernate-3

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

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

所有内容都会编译并执行但是,跳过和取消部分将被忽略,并且所有数据都将被恢复。是否可以将Fetch与Skip和Take一起使用进行分页?

1 个答案:

答案 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)与其子项一起返回的位置。