3

管理者に表示する監査レコードを取得するためにグリッドを呼び出す API をプロジェクトに設定しました。グリッドには無限スクロールが設定されており、mvc4 に組み込まれた oData を使用します。したがって、取得する予定の行数に等しい $top を使用して API を呼び出し、適切なページに移動するように $skip を設定します。

API 内で、nhibernate に対して次の呼び出しを行い、IQueryable を取得して MVC4 に返すことで、これは暗い oData マジックです。

m_session.Query<AuditInfo>().FetchMany(x => x.Parameters).Fetch(x => x.AuditType).Fetch(x => x.Status)

ここで、AuditInfo には、関連するパラメーターのコレクションと、タイプとステータスのルックアップ テーブルがあります。

私の問題は、30行を要求すると、30以下の数値が返されることです。これを少し追跡することができました。問題は、nhibernateが同じクエリにTOPandステートメントを持っていることです。JOIN監査に複数のパラメーターがある場合、監査のコピーを作成して、それを返すための 2 番目のパラメーターを保持します。これを行うと、クエリが許可する TOP(30) のスペースが占有されます。その後、nhibernate に戻ると、これらの行がマージされているように見え、必要以上にレコードが少ないコレクションが残ります。

ここでの私の質問は次のとおりです。パラメーターを個別に取得して n+1 クエリを実行することなく、正確な数のレコードを取得できるように、この呼び出しを設定するにはどうすればよいですか?

4

1 に答える 1

1

それがSQLの仕組みであるため、基本的に簡単にはできません。FetchMany を除外すると、Select N+1 を使用して機能するはずです。コレクションのバッチサイズを微調整して、NH が同じタイプの複数のコレクションを一度にロードできるようにします。

于 2012-07-31T13:02:52.593 に答える