NHibernate Linq和DistinctRootEntity

Rem*_*Ros 4 c# linq nhibernate linq-to-nhibernate

当我执行以下查询时,我得到一个异常,告诉我'feedItemQuery'包含多个项目(因此SingleOrDefault不起作用).

当使用Criteria api而没有DistinctRootEntity转换器时,这是预期的行为,但是当使用linq时,我希望得到一个单一的根实体(FeedItem,其属性Ads(of 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 !?
Run Code Online (Sandbox Code Playgroud)

映射:

<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>
Run Code Online (Sandbox Code Playgroud)

提前致谢

Sim*_*mon 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
Run Code Online (Sandbox Code Playgroud)

  • 既然旧的Session.Linq不再存在,我们现在有session.Query <>,有没有办法仍然指定这个,我再也看不到QueryOptions或RegisterCustomAction属性/方法了 (2认同)