[英]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.