2012-01-26 53 views
0

讓我們假設我有三個表: 類別,項目和CategoriesToItems實體框架生成不必要的查詢

類別和項目之間的關係是許多一對多(通過CategoriesToItems表)。

讓我們假設我調用一些方法,我們執行以下代碼方法內(強制執行查詢的數據/枚舉立即):

var categories = context.Categories.ToList(); 
var items = context.Items.ToList(); 
var links = context.CategoriesToItems.ToList(); 

在此之後,我立即開始檢查每個產品像這樣:

foreach(Category category in categories) 
{ 
    foreach(Item item in links.Select(l => l.Item)) 
    { 
     //Do some stuff. 
    } 
} 

爲什麼這些foreach循環生成對數據庫的查詢? EF不應該已經知道所有必需的信息,因爲我加載了類別,項目和鏈接表條目?

有趣的是,如果我改變了一點東西,並加載想通過類似的循環,使

var items = context.Items.ToList(); 
var categories = context.Categories.Include("CategoriesToItems").ToList(); 

運行不生成查詢時,我想知道的產品在任何特定類別的數據是什麼。

我關心的原因是加載數據的第一種方式要快得多,但之後我必須立即對數據執行操作,並且性能會慢得多(因爲每次都會生成額外的查詢) 。

實際的include子句比較複雜,因爲我們需要來自多個不同表的數據,這就是爲什麼單獨加載整個表比加載精細生成的多重連接查詢加載整個表更快的原因(我們需要所有的它們中的數據)。在真正的應用程序中有更多的表格(類別可以有標籤,項目可以有標籤,兩種關係都是多對多的 - 我確信你得到的圖片 - 「做東西」部分實際上是建立一個字典中的項目/類別以及它們所具有的標籤和標籤都是繼承的,因此標有X的類別表示其所有產品都標有X)。當我從所有相關表中加載的每一個單列 爲什麼在實體框架生成有關的關係查詢:


要概括/這簡化了一點點?我能做些什麼來幫助這種情況?


編輯:我要補充一點,我假設它的實際撥打電話到數據庫,因爲在LiveTrace顯示了ADO.NET查詢條目時,這些代碼特定行執行並因爲性能明顯不同。所以,如果我誤解了那些LiveTrace條目的含義,那麼我想我會遇到一個不同的問題。

回答

0

嘗試之前關閉延遲加載到執行任何查詢:

context.ContextOptions.LazyLoadingEnabled = false;