2017-08-17 52 views
0

我有這樣的事情在我的C#MVC控制器:實體框架的Core2 LINQ - 每個連接可以作爲獨立的查詢

from table1 in db.Table1.AsQueryable() 
join table2 in db.Table2.AsQueryable() on table1.Col1 equals table2.Col1 
join table3 in db.table3.AsQueryable() on new { table2.Col2, table2.Col5 } equals new { table3.Col2, table3.Col5 } 
. 
. 
few more joins 
. 
. 
WHERE ...... 
select new {table1.Prop1, table2.Prop2, table3.Prop3} 

當我看着它運行在SQL事件探查器,我期待有一個查詢所有的連接。它所做的是,它在不同的查詢中選擇所有表中的所有列。即運行

SELECT * FROM Table2 --Instead of * it has all column names 

當這樣運行完畢後,運行

SELECT * FROM Table3 --Instead of * it has all column names 

等爲每個表。表格很大,因此需要很長時間才能使用很多內存。我在實體上添加了AsQueryable(),但它沒有什麼區別,仍然是多個查詢。 dbDbContext,使用核心2.

如何更改LINQ或其他設置,使整個事件作爲單個查詢運行?

更新

它看起來像這個問題是由具有連接列上的一個Convert.ToInt32(造成的。我加入的int列在一個表中可以爲空,而在另一個表中不可以爲空,因此我可以在可空的 表上刪除Convert.ToInt32(,刪除轉換生成的單個查詢。

+2

那麼,你絕對不需要那些'AsQueryable'調用。你爲什麼要這樣做......在新的{table2.Col2,table2.Col2}等於new {table3.Col2,table3.Col2}'? –

+0

@BradleyUffner我試圖看看他們是否會有所作爲,但他們沒有。 – curious

+0

@BradleyUffner查看編輯,錯誤輸入了兩次相同的列名。 – curious

回答

0

根據LINQ2SQL文件:

當查詢的對象,你實際上只檢索您請求的對象。相關對象不會自動同時獲取。

DataLoadOptions類提供了兩種方法來實現立即加載指定的相關數據。 LoadWith方法允許立即加載與主要目標相關的數據。 AssociateWith方法允許過濾相關對象。

這是Lazy Loading vs Eager Loading的問題。

這是一篇很好的文章,有很好的解釋。

Lazy Loading And Eager Loading In LINQ To SQL

+2

嗯,你不是*錯誤*,但我不認爲這與這個問題有任何關係。 –