2

我有这个查询:

IQueryable<OrderEntity> _records = All().Fetch(x => x.client).FetchMany(x => x.orderItems).ThenFetch(y => y.righeDistinte); 

就这个问题而言,这些是所涉及的实体:

public class OrderEntity : IEntity
{
    public virtual ClientEntity client { get; set; }
    public virtual ICollection<OrderItemEntity> orderItems { get; set; }
}

public class ClientEntity
{
    public virtual String cod_clifor { get; set; }
    public virtual String des_ragsoc { get; set; }
}

public class OrderItemEntity
{
    public virtual ICollection<DistintaItemEntity> righeDistinte { get; set; }
}

public class DistintaItemEntity
{
    public virtual OrderItemEntity orderItem { get; set; }
    public virtual DistintaEntity distinta { get; set; }
}

因此,每个 OrderEntity 实例引用一个 ClientEntity 和 0 到多个 OrderItemEntity 对象。反过来,每个 OrderItemEntity 可以引用 0 到多个 DistintaItemEntity。

这篇文章顶部的查询返回具有相关客户端和订单项的所有订单的集合,并且每个订单项都具有提取的区别(所有映射都设置得很好)。只需一个 SQL 查询。

到目前为止,一切都很好。

问题在于 DistintaEntity,它不是强制加载的,所以如果我想访问它的一些属性,我需要打开会话,因为延迟加载(只要有一个打开的会话,它就可以工作,但是还有其他查询当然)。

我想在查询中添加一个指令,以强制直接获取与每个 DistintaItemEntity 关联的 DistintaEntity 对象,但我不知道如何在不丢失单个查询结果的情况下执行此操作。

所有一对多关系都是左连接。

谢谢,马里奥

4

2 回答 2

1

跟进:我在之前的回答中提到的查询确实有效,但是,正如上面评论中的手印所述,由于 nHibernate 不正确地扫描笛卡尔积,很容易导致多个孩子。

我尝试了链接文章中提到的解决方案之一:更改映射以将 AsSet() 指令添加到 HasMany() 似乎也解决了这个问题。

此处的完整堆栈溢出问题:NHibernate ThenFetchMany is retrieving duplicate children

于 2012-08-27T15:39:11.070 回答
0

在第一条评论之后,我设法找到了答案:通过将最后一个 ThenFetch 替换为 ThenFetchMany,我能够指定一个更进一步的链式 Fetch,它会产生完全想要的结果,仍然是一个带有添加连接的 SQL 查询,并且 DistintaEntity 加载不懒惰。

最后的查询是:

IQueryable<OrderEntity> _records = All().Fetch(x => x.client).FetchMany(x => x.orderItems).ThenFetchMany(y => y.righeDistinte).ThenFetch(p => p.Distinta);

非常感谢您的帮助。

于 2012-08-23T09:24:17.557 回答