簡體   English   中英

如何使用Entity Framework顯式加載映射表?

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM