【问题标题】:NHibernate Linq and DistinctRootEntityNHibernate Linq 和 DistinctRootEntity
【发布时间】:2009-04-28 08:56:23
【问题描述】:

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

这是在使用没有 DistinctRootEntity 转换器的 Criteria api 时的预期行为,但在使用 linq 时,我希望获得单个根实体(FeedItem,具有包含所有广告的属性 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 !?

映射:

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

提前致谢

【问题讨论】:

    标签: c# linq nhibernate linq-to-nhibernate


    【解决方案1】:

    您可以使用 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
    

    【讨论】:

    • 因为旧的 Session.Linq 不再存在,我们现在有了 session.Query,有没有办法仍然指定这个,我看不到 QueryOptions 或 RegisterCustomAction 属性/方法了
    【解决方案2】:

    var feedItemQuery = 来自 session.Linq().Expand("Ads")
    中的广告 其中 ad.Id == Id
    选择广告**.FirstOrDefault();**

    【讨论】:

    • 有点骇人听闻(因为我们希望得到一个单一的结果),但我认为这样就可以了。我会尝试并更新我的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多