2009-04-28 6 views
4

次のクエリを実行すると、 'feedItemQuery'に複数の項目が含まれているため、例外が発生します(SingleOrDefaultは機能しません)。NHibernate LinqとDistinctRootEntity

これは、DistinctRootEntityトランスフォーマーを使用しないCriteria APIを使用しているときに予想される動作ですが、linqを使用すると、すべての広告を含むAds(ICollectionの)プロパティを持つ単一のルートエンティティ(FeedItem)を取得します。

NHibernate.LinqにDistinctRootEntityトランスフォーマを使用するように指示する方法はありますか?

マイクエリ:

var feedItemQuery = from ad in session.Linq<FeedItem>().Expand("Ads") 
        where ad.Id == Id 
        select ad; 

var feedItem = feedItemQuery.SingleOrDefault(); // This fails !? 

マッピング:事前に

<class name="FeedItem" table="FeedItems" proxy="IFeedItem"> 
    <id name="Id" type="Guid"> 
     <generator class="guid.comb"></generator> 
    </id> 
... 
    <set name="Ads" table="Ads"> 
     <key column="FeedItemId" /> 
     <one-to-many class="Ad" /> 
    </set> 
</class> 

おかげ

答えて

6

あなたは結果のトランスを設定するRegisterCustomActionメソッドを使用することができます(私たちは戻って単一の結果を得ることを期待として)ちょっとハック

var linqsession = session.Linq<FeedItem>(); 
linqsession.QueryOptions.RegisterCustomAction(c => c.SetResultTransformer(new DistinctRootEntityResultTransformer())); 
var feedItemQuery = from ad in linqsession.Expand("Ads") 
        where ad.Id == Id 
        select ad 
+0

私はそれについて前に考えなかった、ありがとう! –

+2

古いSession.Linqはもう存在しないので、私たちは今session.Queryを持っていますが、これを指定する方法はありますか?QueryOptionsまたはRegisterCustomActionプロパティ/メソッドはもう見れません –

0

VAR feedItemQuery = session.Linq(内広告から)( "広告")を展開
ad.Id == Id
広告を選択**。FirstOrDefault(); **

+0

が、私はこれがそうなると思います。私はそれを試し、私の質問を更新します。 –

関連する問題