简体   繁体   English

NHibernate Linq和DistinctRootEntity

[英]NHibernate Linq and DistinctRootEntity

When I execute the following query, I get an exception telling me that 'feedItemQuery' contains multiple items (so SingleOrDefault doesn't work). 当我执行以下查询时,我得到一个异常,告诉我'feedItemQuery'包含多个项目(因此SingleOrDefault不起作用)。

This is expected behaviour when using the Criteria api WITHOUT the DistinctRootEntity transformer, but when using linq, I expect to get a single root entity (FeedItem, with the property Ads (of ICollection) containing all Ads). 当使用Criteria api而没有DistinctRootEntity转换器时,这是预期的行为,但是当使用linq时,我希望得到一个单一的根实体(FeedItem,其属性Ads(of ICollection)包含所有广告)。

Is there a way to tell NHibernate.Linq to use the DistinctRootEntity transformer? 有没有办法告诉NHibernate.Linq使用DistinctRootEntity转换器?

My query: 我的查询:

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

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

The mapping: 映射:

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

Thanks in advance 提前致谢

You can use the RegisterCustomAction method to set the result transformer: 您可以使用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

var feedItemQuery = from ad in session.Linq().Expand("Ads") var feedItemQuery =来自session.Linq()中的广告。展开(“广告”)
where ad.Id == Id 其中ad.Id == Id
select ad**.FirstOrDefault();** 选择广告**。FirstOrDefault(); **

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM