Fluent nHibernate中的嵌套查询

时间:2012-08-22 16:29:30

标签: c# linq fluent-nhibernate

我有这个问题:

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对象,但我不知道如何在不丢失单个查询结果的情况下执行此操作。

所有一对多的关系都会被加入。

谢谢,     马里奥

2 个答案:

答案 0 :(得分:1)

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

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

Full Stack Overflow问题:NHibernate ThenFetchMany is retrieving duplicate children

答案 1 :(得分:0)

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

最终查询是:

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

非常感谢您的帮助。