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

问题描述 投票:0回答:1

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

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

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

c#-4.0 pagination nhibernate linq-to-nhibernate nhibernate-3
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) 及其子对象。

© www.soinside.com 2019 - 2024. All rights reserved.