[英]How to explicitly load mapping tables with Entity Framework?
由于多个.Include(...)
语句,生成的SQL变得越来越复杂,因此我必须优化Entity Framework查询。
我不再使用Includes,而是开始使用显式加载,这很好,因为我有一些较小的表,最好通过QueryableExtensions的Load方法显式加载 。
但是,我找不到为多对多连接表显式加载映射表的简便方法-因为映射表未映射到DbSet ...
我将“代码优先”与这样的映射一起使用:
modelBuilder.Entity<SomeEntity>()
.HasMany(a => a.SomeProperty)
.WithMany()
.Map(c =>
{
c.ToTable("MappingTable");
});
有什么简单的方法可以显式地加载MappingTable而不映射它们?
现在,我意识到当我包含具有多对多关系的多个(至少2个)字段时, Include
语句会生成UNION-这似乎是合乎逻辑的,尽管起初我不知道后台发生了什么。 多个UNION的问题在于,如果有很多UNION,查询可能会非常复杂。
原来,我可以使用相同的查询过滤器“预取”多对多连接。 如果我为每个多对多连接进行预取,这将简化查询(尽管它使数据库服务器进行了多次往返,但这对我来说不是一个大问题)。
因此,用一个例子来说明它-而不是像这样写:
var query = ctx.Employee
.Include(e => e.ContactAddresses)
.Include(e => e.Contracts)
.MyFilter();
query.ToList().Select(e =>
{
ContactNames = e.ContactAddresses.Select(c => c.DisplayName),
ContractNames = e.Contracts.Select(c => c.DisplayName)
});
写类似:
ctx.Employee.Include(e => e.ContactAddresses).MyFilter().ToList();
ctx.Employee.Include(e => e.Contracts).MyFilter().ToList();
var query = ctx.Employee
.MyFilter();
query.ToList().Select(e =>
{
ContactNames = e.ContactAddresses.Select(c => c.DisplayName),
ContractNames = e.Contracts.Select(c => c.DisplayName)
});
MyFilter()包含查询的一部分的过滤逻辑(Where语句等)。
而且,此解决方案也优于显式加载整个映射表(这是我的第一个想法-参见原始问题),因为在某些情况下映射表可能很大。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.