管理者に表示する監査レコードを取得するためにグリッドを呼び出す 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が同じクエリにTOP
andステートメントを持っていることです。JOIN
監査に複数のパラメーターがある場合、監査のコピーを作成して、それを返すための 2 番目のパラメーターを保持します。これを行うと、クエリが許可する TOP(30) のスペースが占有されます。その後、nhibernate に戻ると、これらの行がマージされているように見え、必要以上にレコードが少ないコレクションが残ります。
ここでの私の質問は次のとおりです。パラメーターを個別に取得して n+1 クエリを実行することなく、正確な数のレコードを取得できるように、この呼び出しを設定するにはどうすればよいですか?