2012-03-10 5 views
1

QueryOver APIを使用して、以下のHQLクエリをどのように置き換えることができますか? JoinAliasJoinQueryOverの両方が関連するエンティティへのパスを記述した発現を必要とするのでQueryOverを使用したクロスジョイン

var sql = "from Role r, Action a where r.Active = :active and a.Active = :active"; 
var result = manager.Session.GetISession().CreateQuery(sql) 
      .SetBoolean("active", true).List(); 

答えて

2

私ははQueryOverでこれを行う方法があります信じていません。

しかし、これは、LINQツーNHibernateの中で達成することは簡単です:

var result = 
    (from role in manager.Session.GetISession().Query<Role>() 
    from action in manager.Session.GetISession().Query<Action>() 
    where role.Active == true && action.Active == true).ToList(); 

NH 3.2で、ここで私が手SQLです:

select role0_.Id as col_0_0_, 
     action1_.Id as col_1_0_ 
from [Role] role0_, 
     [Action] action1_ 
where role0_.IsActive = 1 /* @p0 */ 
     and action1_.IsActive = 1 /* @p1 */ 
+0

うう、いやそれはありません。 1つのSQLステートメントを生成します... –

+0

上記の解決策は、魔法の文字列の問題を避けることができますが、私はそれを信じていません。これは、上記のステートメントがNHibernateがデータベースを何度もquerryに導くためです。ロールテーブルに4つのレコードがあり、アクションテーブルには6つのレコードがあるとします。 NHibernateが実行する最初のクエリは、Roleテーブルから4つのレコードを返すことです。その後、返されたレコードごとに、NHibernateはデータベースを読み込み、Actionテーブルから6レコードを取得します。つまり、データベースへのルートの数は、最初のクエリの返されたレコードの数に等しくなり、1に加算されます。 – tilonthuduc

+0

Andrew、私は試しましたが、結果は私が上で説明したものです。あなたは同じことをしてもらえますか? – tilonthuduc

関連する問題