Вызов Fetch в NH 3.1 игнорирует Skip and Take - PullRequest
2 голосов
/ 08 августа 2011

У нас есть запрос, который мы пытаемся написать для подкачки, где мы хотим использовать Fetch, чтобы загрузить коллекцию для объекта, а затем вернуть постраничный список этого объекта. Приведенный ниже запрос не работает, потому что когда мы смотрим в профилировщике, он пропускает настройки Skip и Take и просто возвращает список объектов (загруженных с нетерпением):

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

Все компилируется и выполняется, но пропускаемые и пропускаемые части игнорируются, и все данные возвращаются. Можно ли использовать Fetch в сочетании с Skip and Take для подкачки?

1 Ответ

2 голосов
/ 08 августа 2011

Вы пробовали вызывать fetch, прежде чем пропустить и взять

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

Из того, что я помню, NH не может обрабатывать загрузку соединения с предельной нагрузкой с ограничениями в запросе (это связано с SQL, а не с NH).Это может работать с sub select.

** UPDATE

Рассмотрим этот пример

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) со своими детьми.

...