2012-02-10 18 views
1

マッピングにNhibernateとFluent NHibernateを使用すると、子エンティティと1対多の関係を持つ親エンティティがあります。親エンティティで HasMany子エンティティが条件を満たすすべてのNHibernate親エンティティを検索

は、私は、子エンティティの開始日と終了日性質を持っている

this.HasMany<Child>(x => x.Child).KeyColumn("ParentID").Cascade.None(); 

に接続されているすべての子どもを一覧表示することができます。私は子供がいるすべての親を選択したいと思いますChild.BeginDate >= DateTime.Now && Child.EndDate < DateTime.Now

私はNHibernateを使用してこれを達成する方法に対して頭を叩いています。

これは明らかに機能しませんでしたが、私の最初の試みはこれでした。

s.CreateCriteria<Parent>() 
    .Add(Expression.Where<Parent>(x => x.Children.Where<Child>(y => y.BeginDate <= DateTime.Now && y.EndDate > DateTime.Now).Count() > 0)) 
    .List<Parent>(); 

私はT-SQLでそうすることができます。

SELECT p.* FROM dbo.ParentTable p 
WHERE (SELECT COUNT(*) FROM dbo.ChildTable c WHERE p.ID = c.ParentID AND c.BeginDate <= GETDATE() AND c.EndDate > GETDATE()) > 0 

成功!

s.CreateCriteria<Parent>() 
    .CreateAlias("Child", "Child") 
    .Add(Restrictions.Le("Child.BeginDate", DateTime.Now)) 
    .Add(Restrictions.Gt("Child.EndDate", DateTime.Now)) 
    .SetResultTransformer(new NHibernate.Transform.DistinctRootEntityResultTransformer()) 
    .List<Parent>(); 

答えて

1

これはあなたのために働くかどうかを確認してください:

var criteria = Session.QueryOver<Parent>(); 
criteria.JoinQueryOver<Child>(x => x.Children) 
     .Where(y => (y.BeginDate <= DateTime.Now) && (y.EndDate > DateTime.Now)); 

criteria.TransformUsing(Transformers.DistinctRootEntity); 
return criteria.List(); 
+0

感謝を。あなたの努力を捨ててはいけませんが、あなたの投稿の直前に解決策が見つかりました。私はあなたの答えを私の問題に適応させようとしましたが、すぐに運はありません。これは別個のエンティティを返す方法を決定するのに役立ちました。 –

+1

OK、何とか役立ってくれてうれしいです。私はあなたがQueryOverまたはLinq(私はあなたがNH3を使用していると仮定している)のいずれかを導入することによって、クエリの魔法の文字列を避けることをお勧めします。たぶん[this](http://www.pastie.org/3357314)スニペットがもっと役立つでしょう。 –

関連する問題