如何解决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 举报,一经查实,本站将立刻删除。