2011-12-15 11 views
0

これはどのように動作するのか理解しようとしています。 私は、腐ったリンゴを含まない特定のIDリストからすべてのツリーを持つことです。 簡単に見えますが、私はNHibernateの新機能ですが、SQLではそれほど良くなく、あなたが見ることができるように私は立ち往生しています。NHibernate QueryOverのサブクエリの親のID

私がダウンしてここにこのコードを書いた:

Tree treeitem = null; 

QueryOver<Apple> qapple = QueryOver.Of<Apple>() 
    .Where(x => (!x.IsRotten)) 
    .And(Restrictions.IdEq(Projections.Property<Tree>(y => y.Id))) 
    // Or this one... 
    //.And(Restrictions.EqProperty(
    //  Projections.Property<Apple>(y => y.Tree.Id), 
    //  Projections.Property<Tree>(y => y.Id))) 
    .Select(x => x.Id); 

return this.NHibernateSession.QueryOver<Tree>() 
    .Where(x => x.Id.IsIn(ListOfTreeId)) 
    .WithSubquery.WhereExists<Apple>(qapple) 
    .SelectList(list => list 
     .Select(z => z.Id).WithAlias(() => treeitem.Id) 
     .Select(z => z.Name).WithAlias(() => treeitem.Name) 
     .Select(z => z.Type).WithAlias(() => critem.Type) 
    .TransformUsing(Transformers.AliasToBean<Tree>()) 
    .List<T>(); 

そして、私が取得擬似SQLはこのようなものです:あなたが同じを使用するサブクエリに問題があります見ることができるように

SELECT id, name, type FROM trees WHERE id IN (1, 2, 3) 
AND EXIST(SELECT id FROM apples WHERE NOT rotten AND apples.idtree = apples.id) 

そのようなテーブルIDの代わりに何か:

EXIST(SELECT id FROM apples WHERE NOT rotten AND apples.idtree = tree.id) 

はアイムビットが実際に失われました。たぶん、これを構築する別の方法があります。 ご協力いただきありがとうございます。戻り値の型は、クエリの種類と同じであるときにresulttransformerを使用している理由

答えて

3

イムわからない

return NHibernateSession.QueryOver<Tree>() 
    .Where(t => t.Id.IsIn(ListOfTreeId)) 
    .JoinQueryOver<Apple>(t => t.Apples) 
     .Where(a => !a.IsRotten) 
    .List(); 

更新:それは本当にJoinQueryOverにおけるジェネリック引数を明示的に指定し、そのためAppleを選択する必要がありながら、コンパイラがICollection<Apple>を選択

アップデート2:彼らはユニークな取得する

OPT 1)

resulttransformerについて

OPT 2)

Tree treeAlias = null; 

var nonRottenApples = QueryOver.Of<Apple>() 
    .Where(a => !a.IsRotten) 
    .Where(a => a.Tree.Id == treeAlias.Id) 
    .Select(x => x.Id); <- optional 

return NHibernateSession.QueryOver(() => treeAlias) 
    .Where(t => t.Id.IsIn(ListOfTreeId)) 
    .WithSubquery.WhereExists(nonRottenApples) 
    .List(); 
+0

私は、先端に感謝をガイドに従いました。 .JoinQueryOver(t => t.Apples) .Where(a =>!a.IsRotten) ApplesがリストであるためWhere.IsRottenは使用できないため、Where句は機能しません。 –

+0

ありがとう、それは動作しますが、私は重複の主な問題を抱えています。ツリーの場合、条件に合致する2つのリンゴがある場合、結果として同じツリーが2回表示されます。 –

+0

あなたの時間をありがとう、これらは良いヒントです。まだそれを動作させるようにしようとしています(treeAlias.Idの例外は見つかりませんでした)が、それは良いスタートです! –

関連する問題