2011-12-20 7 views
2

私はこのような問題を抱えているようですが、実際にはSOとGoogleのソリューションのどれも私のために働いていません。QueryOverとの独立した呼び出しとページング

は(私に非常に似)このような状況を考えてみましょう:

public class User 
    { 
    public int Id; 
    public string Name; 
    //30 other fields; 
    public IList<Role> Roles; 
    } 

    public class Role 
    { 
    public int RoleNumber; 
    public int UserId; 
    } 

1ユーザーは、0-多くの役割を持つことができます。

ユーザーのグリッドビューのリストに、そのフィールドと追加の「役割」列を表示して、すべてのRoleNumbers(リピーターを使用)を表示したいとします。そのためには、役割を持つユーザーのリストを区別する必要があります。

QueryOverでこのようなクエリを作成することはできますか?インターネットからのすべてのソリューションは、Idとサブクエリを作成して、サブクエリにあるIdを返す2番目のクエリを作成する必要があると言います。それは動作し、私には別のリストを返すが、ロールはないので、NHは各ユーザに欠けている情報を得るために追加の選択肢を生成する。

マイクエリ:私は2番目を追加した場合の役割

せずにリストをdistincted

Role roles = null; 
User users = null; 
IQueryOver<User,User> userQuery = ... 
IQueryOver<User,User> distQuery = ... 
distQuery.JoinAlias(f=> f.Roles,() => Roles, JoinType.LeftOuterJoin) 
     .Select(Projections.Distinct(Projections.Id())); 

userQuery.WithSubquery.WhereProperty(g => g.Id).In<User>((QueryOver<User>) distQuery) //and other joins, wheres etc. 

returnesそれが役割でリストを返します。役割に参加し、私は第二の役割に参加追加する場合

を複製し、使用

TransformUsing(new DistinctRootEntityResultTransformer()) 

ユーザーとは別のリストを返します。r olesが、ページングは​​機能せず、RowCount()は不正な番号を返します。

私は何ができますか?

答えて

3

あなたが求めているのは、現在NHibernateでサポートされていません。負荷UsersRolesを熱心に読み上げることはできません。

ページングされたユーザーのリスト(たとえば25)を取得し、必要に応じてロールを遅延ロードします。

Session.QueryOver<User>().Skip(x).Take(25); 

とのマッピング・ファイルを変更します - これは、ユーザーのすべてのロールを取得するために2番目のクエリを発行し、その後ページングUsersのリストを取得するために、1つのクエリを送信します

<bag class="Role" Name="Roles" batch-size='25' ...> 
... 
</bag> 

。これははるかにパフォーマンスの高い方法です。

+0

私は欲しかったのは、選択肢の数を減らし、場合によっては> 200個の選択を生成していた(ほとんどがnullを返す)ことでした。 。 – Kostrzak

関連する問題