12

次のクエリが機能していて、必要な結果が得られます。

int associatedId = 123;

MyObject alias = null;

var subQuery = QueryOver.Of<DatabaseView>()
    .Where(view => view.AssociatedId == associatedId)
    .And(view => view.ObjectId == alias.ObjectId)
    .Select(view => view.ObjectId);

var results = session.QueryOver<MyObject>(() => alias)
    .WithSubquery.WhereExists(subQuery)
    .List();

DatabaseView実際のNHibernateエンティティとしてマッピングされています(したがって、で使用できます)が、HBMマッピングでQueryOverは関連付けられていません。MyObject

このクエリは、IList<MyObject>を使用してを返しますSELECT ... FROM MyObject WHERE EXISTS (subquery for DatabaseView here)。これを書き直して同じデータを返すが、サブクエリの代わりにJOINを使用するにはどうすればよいですか?

4

3 に答える 3

6

NHibernate 3+ では、Linq を使用して無関係なエンティティに参加できます

おかしなことに、joinクエリ式要素を使用します。

from type1 in Repository.Query<MyType1>() 
join type2 in Repository.Query<MyType2>() 
on type1.Id equals type2.Id

注: Repository.Query は、セッションから IQueryable Query を返すだけです。

ドメイン内で常に双方向の関係をモデル化したいわけではないので、QueryOver の解決策があることを願っていますが、それでもクエリには役立ちます。

また、POCO クラスに入れることなく、Criteria API を使用して Access="noop" 双方向の関係をマップできます。

http://ayende.com/blog/4054/nhibernate-query-only-properties

于 2011-07-25T22:13:38.333 に答える