NHibernate查询LINQ生成冗余联接

问题描述

为什么以及如何解决来自NHibernate查询linq的sql请求中的冗余生成联接? 使用此linq请求:

var query1 = _session.Query<EntityLOTQUALITE>().Where(l =>  l.OBJ_SOUSFAB.OBJ_FAB.OBJ_LIGNE.LICLEUNIK == licleunik &&
                        l.DATECREATION >= startDate && l.DATECREATION <= endDate)
                            .FetchMany(lq => lq.LST_LOTQPAL)
                            .ThenFetch(lqp => lqp.OBJ_PALETTE)
                            .Fetch(f => f.OBJ_SOUSFAB)
                            .ThenFetch(f => f.OBJ_FAB)

在请求sql生成“ from”子句如下:

...
from
    LOTQUALITE entitylotq0_
inner join
    SOUSFAB entitysous1_
        on entitylotq0_.soFCLEUNIK=entitysous1_.soFCLEUNIK
inner join
    FAB entityfab2_
        on entitysous1_.OFCLEUNIK=entityfab2_.OFCLEUNIK
left outer join
    LOTQPAL lst_lotqpa3_
        on entitylotq0_.LQCLEUNIK=lst_lotqpa3_.LQCLEUNIK
left outer join
    PALETTE entitypale4_
        on lst_lotqpa3_.PACLEUNIK=entitypale4_.PACLEUNIK
left outer join
    SOUSFAB entitysous5_
        on entitylotq0_.soFCLEUNIK=entitysous5_.soFCLEUNIK
left outer join
    FAB entityfab6_
        on entitysous5_.OFCLEUNIK=entityfab6_.OFCLEUNIK
left outer join
    LIGNE entitylign7_
        on entityfab6_.LICLEUNIK=entitylign7_.LICLEUNIK
                            .ThenFetch(f => f.OBJ_LIGNE);

“ SOUSFAB”上的连接出现两次,“ left”和“ inner”,因为在where()和fetch()中存在。 Fetch()是必需的,因为我们使用了“ AutoMapper”。 因此,我只想在我的sql请求中加入一个

编辑:我们与AutoMapper的映射配置是在包含生成的Dto的外部dll上全局实现的。然后,在需要时可以添加其他dto并包含嵌套属性。例如,上述请求的Dto如下所示:

[AutoMap(typeof(EntityLOTQUALITE))]
public class DtoQualityBatchWithSubProdAndPallets : DtoQUALITYBATCH
{
    [SourceMember(nameof(EntityLOTQUALITE.OBJ_SOUSFAB))]
    public DtoSubProductionWithJobAndBatchsAndFinishedProduct SubProduction {get;set;}

    [SourceMember(nameof(EntityLOTQUALITE.LST_LOTQPAL))]
    public IList<DtoPalletsPerQualityBatchWithPal> ListPallets { get; set; }
}

我想建议的解决方案.AutoMapper中的ProjectTo()扩展名不能应用?

谢谢。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)