2009-03-20 4 views
1

私が取り組んでいるプロジェクトでは、次の問題があります。システム内の各トランザクションは、特定のユーザーに割り当てられます。トランザクションおよびユーザークラス間の多対1のマッピングがあるように私はNHibernateはこれらのエンティティをマッピングしたnhibernateで最も一般的に使用されるmany-to-oneを照会する方法

public class User 
{ 
    public int ID { get; private set; } 
    public string FirstName { get; set; } 
    .... 
} 

public class Transaction 
{ 
    public int ID { get; private set; } 
    public User CreatedBy { get; private set; } 
    ... 
} 

:だから、そうのようなトランザクションとユーザー間の一対多の関係が、そこにあります。 Userオブジェクトにはトランザクションのリストはありませんが、Transactionにはそのトランザクションを作成したユーザーへの参照があります。

今ほとんどのトランザクションを作成したユーザーのリストを取得するためにクエリを実行したいが、NHibernateを使って上位10人の参照ユーザーを取得する方法がわからない。

アイデア?私はICriteriaを使用してHQLではなくこれを完成させたいと考えていますが、必要であればHQLもOKです。

更新

私は

GetSession().CreateCriteria(typeof (User)) 
    .Add(Subqueries.PropertyIn("Id", topReferencedUsers)) 
    .List<User>(); 

...

DetachedCriteria topReferencedUsers = DetatchedCriteria.For(typeof(Transaction)) 
    .SetProjection(Projections.GroupProperty("CreatedBy.Id")) 
    .SetProjection(Projections.Count("CreatedBy.Id").As("pcount")) 
    .AddOrder(Order.Desc("pcount")) 
    .SetMaxResults(10); 

とサブクエリとしてそれを構築する...などのクエリとシロッコの提案を試みたが、このサブクエリはしていませんトランザクションの合計数を返します。これらのトランザクションは、UserクエリーのIN句として使用されます。両方の投影でProjectionList()を追加すると、必要なサブクエリの出力が得られますが、2つの列の出力をUserクエリーのIN句に実行しようとするため失敗します。 NHibernateにIDとCountの両方を投影するにはどうすればいいのですか?

アップデート(2)

私はシロッコのSqlGroupProjectionの提案を試してみました(あなたのシロッコに感謝)が、空を思いつきました。最初に、プロパティpcountが見つかりませんでしたというエラーが表示されました。これは、注文を削除する必要があることを意味しました。つまり、タイムスタンプで注文していました。しかし、それでも、Usersテーブルに参加するユーザーIDではなく、ユーザーが参照された回数だけが出力されます。何か案は?ありがとう。

+1

こんにちは、私は私の投稿を削除しました。 nhibernateユーザグループに質問すると、http://groups.google.com/group/nhusers?pli=1にもっと多くの運が必要です。あなたは答えがあるときにここに投稿してください、私は自分自身が不思議です。 また、賞金を払うこともできます。 – sirrocco

答えて

0

操作を2つの手順に分けることができます。

1)topReferencedUsersを実行し、メモリ内のint配列にCreatedBy.Id投影を抽出します(10を扱うだけなので)。

2)次に実行します。

GetSession().CreateCriteria(typeof(User)) 
    .Add(Expression.InG<int>("Id", topTenIdArray)) 
    .List<User>(); 
+0

動作しません。少なくとも私にとってはうまくいかない。私はNHibernate 2を使用しています。0.1.GA(SQL Server 2008に対して)。ユーザーはtopTenIdArrayとして注文されません。 –

1

あなたは自分自身でそれを試してみて、あなたが所望の出力を得るかどうかを確認することができます。

var userIds = this.Session 
    .CreateQuery(@" 
select a.User.Id 
from Transaction as a 
group by a.User 
order by count(a.User) desc") 
    .SetMaxResults(10) 
    .List<int>().ToArray(); 

var users = this.Session.CreateCriteria(typeof(User)) 
    .Add(Restrictions.InG("Id", userIds)) 
    .List<Artist>(); 

return users; 

私は22,50,55,90ために私のユーザーを取得秒1に渡されたとき、私は最初のクエリから取得するのuserIdのは、(90,22,50,55)ですが。

関連する問題