问题描述
为什么以及如何解决来自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)
...
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 (将#修改为@)