如何解决EF核心包括多个左联接
将EF Core与Automapper结合使用时,我们使结果SQL在同一表上为每个属性进行左连接。
这是我们班级的联系方式-
public class Foo {
public Bar bar { get; set; }
public string id { get; set; }
}
public class Bar {
public Bar {
fooCollection = new HashSet<Foo>();
childBarCollection = new HashSet<ChildBar >();
}
public string id { get; set; }
private ICollection<Foo> fooCollection { get; set; }
private ICollection<ChildBar> childBarCollection { get; set; }
}
public class ChildBar {
public virtual Bar { get; set; }
public string id { get; set; }
public string name { get; set; }
}
尝试执行以下调用时,它会导致多个左联接,而我只希望其中一个:
SELECT [c1].[Id],[c1].[Name],[c2].[Id],[c2].[Name],FROM [dbo].[Foo] AS [i]
INNER JOIN [dbo].[Bar] AS [c] ON [i].[Id] = [c].[Id]
LEFT JOIN [dbo].[ChildBar] AS [c0] ON [c].[Id] = [c0].[Id]
LEFT JOIN [dbo].[ChildBar] AS [c1] ON [c].[Id] = [c1].[Id]
此呼叫如下:
await this.fooRepository.GetQueryable()
.Include(x => x.Bar).ThenInclude(x => x.ChildBar)
.ProjectTo<DTOReturn>(this.mapper.ConfigurationProvider)
.ToListAsync(cancellationToken)
.ConfigureAwait(false);
对象与数据库之间的映射如下:
FooMap:
builder.HasOne(t => t.bar)
.WithMany(t => t.fooCollection)
.HasForeignKey(x => x.Id);
BarMap:
builder.HasMany(t => t.fooCollection)
.WithOne(t => t.var)
.HasForeignKey(t => t.Id);
builder.HasMany(t => t.childBarCollection)
.WithOne(t => t.Bar)
.HasForeignKey(t => t.Id);
ChildBarMap
builder.HasOne(t => t.bar)
.WithMany(t => t.childBarCollection)
.HasForeignKey(d => d.Id);
以下是映射配置文件:
FooMappingProfile
this.CreateMap<Foo,DTOReturn>()
.ForMember(x => x.DTO2,opts => opts.MapFrom(r => r.Bar))
BarMappingProfile
this.CreateMap<Bar,DTO2>()
.ForMember(x => x.Id,opts => opts.MapFrom(r => r.ChildBar.Id))
.ForMember(x => x.Name,opts => opts.MapFrom(r => r.ChildBar.name));
ChildBarMapping :
this.CreateMap<ChildBar,opts => opts.MapFrom(r => r.Id))
.ForMember(x => x.Name,opts => opts.MapFrom(r => r.name));
想知道这是否有人遇到过。上面的示例很粗糙,因为我无法提供业务代码,但这可以说明正在发生的事情。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。