2009-04-28 36 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