NHibernate Linq and DistinctRootEntity

人走茶凉 提交于 2019-11-30 17:20:22

问题


When I execute the following query, I get an exception telling me that 'feedItemQuery' contains multiple items (so SingleOrDefault doesn't work).

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

Is there a way to tell NHibernate.Linq to use the DistinctRootEntity transformer?

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


回答1:


You can use the RegisterCustomAction method to set the result transformer:

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



回答2:


var feedItemQuery = from ad in session.Linq().Expand("Ads")
where ad.Id == Id
select ad**.FirstOrDefault();**



来源:https://stackoverflow.com/questions/796889/nhibernate-linq-and-distinctrootentity

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!