2

ページング用に記述しようとしているクエリがあり、Fetch を使用してオブジェクトのコレクションを熱心に読み込み、そのオブジェクトのページ化されたリストを返します。以下のクエリは機能しません。これは、プロファイラーを見ると、Skip と Take の設定がスキップされ、オブジェクトのリスト (熱心に読み込まれた) が返されるだけだからです。

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

すべてがコンパイルおよび実行されますが、スキップ部分とテイク部分は無視され、すべてのデータが戻されます。Fetch を Skip および Take と組み合わせてページングに使用することはできますか?

4

1 に答える 1

2

skip と take の前に fetch を呼び出してみましたか

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

私が覚えていることから、NHはクエリに制限のある結合熱心な読み込みを処理できません(NHではなくSQLに関係しています)。ただし、サブセレクトで機能する場合があります。

**アップデート

この例を考えてみましょう

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) は、2 つの子 (Id 1) を持つ 1 つのオブジェクトを返します。最初の 2 つのオブジェクト (Id 1,2) とその子を返したい場所。

于 2011-08-08T19:11:02.347 に答える