2009-04-28 71 views
4

當我執行下面的查詢時,我得到一個異常告訴我'feedItemQuery'包含多個項目(所以SingleOrDefault不起作用)。NHibernate Linq和DistinctRootEntity

這是使用Criteria API但不使用DistinctRootEntity轉換器時的預期行爲,但在使用linq時,我希望獲得單個根實體(FeedItem,包含所有Ads的屬性Ads(ICollection))。

有沒有辦法告訴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 !? 

映射:提前

回答

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

以前我沒有想過,謝謝! – 2009-09-04 11:40:40

0

VAR feedItemQuery =

<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> 

感謝session.Linq()從廣告展開( 「廣告」)
where ad.Id == Id
select ad **。FirstOrDefault(); **

+0

有點哈克(因爲我們希望得到一個結果回),但我認爲這會做。我會嘗試它並更新我的問題。 – 2009-05-19 15:38:58