2011-03-08 76 views
2

我是LINQ to SQL的新手,因此這個問題。LINQ to SQL工作外鍵錶行

默認情況下,如果我爲一行查詢,LINQ to SQL是否獲取所有foriegn關鍵行?

如:

讓我們說我有1> N的關係將3臺

分公司-N>部門-N>員工 如果我查詢一個品牌排

Branch b = (
    from b in brachDataContext.Branches 
    where b.id = id 
    select b).ToList(); 

這是否會提取與分支行相關的所有部門以及與這些部門相關的員工?

如果是這樣,那將是一個巨大的對象。每個分支可能有10個部門,每個部門可能有1000個員工,我們可能不需要所有的記錄。

回答

3

Linq 2 SQL默認使用延遲執行,這意味着如果您枚舉該集合,則將提取您的部門。

但是,您可以控制是否應該通過設置context.LoadOptions財產,像這樣

DataLoadOptions dlo = new DataLoadOptions(); 
dlo.LoadWith<Branch>(b => b.Departments); 
context.LoadOptions = dlo; 
... query ... 

檢查this post了關於延遲執行的詳細信息包含在初始查詢。

還閱讀了IEnumerable和IQuerable及其行爲之間的區別。這是瞭解所有Linq提供商的關鍵。我的經驗是,Linq 2 Sql適用於較小的項目和快速開發等。如果您有其他的任何其他的東西,請考慮轉移到Entity Framework或NHibernate以獲得更多功能完整的體驗。

+0

他們沒有加載的默認行爲 – Pleun 2011-03-08 13:26:11

+0

所以在默認行爲中,如果linq2sql只在我訪問分支對象中的部門時(例如使用foreach)在數據庫中執行查詢,我是對的嗎?同樣,如果我使用foreach語句(branch.Departments中的部門d),這些相關部門行是在單個數據庫調用中獲取的嗎? – maX 2011-03-08 13:27:39

+0

這取決於你做什麼,但它經常發生,你會得到很多電話到數據庫。在這些情況下,我建議使用分析器來查看生成的SQL。但是,如果您知道您將需要它們,最好使用LoadOptions – Pleun 2011-03-08 13:33:46

0

如果是這樣,那將是一個巨大的對象。 每個分支可能有10個部門 和每個部門可能有1000 僱員,我們可能不需要所有的 記錄。

Branch b = (  from b in brachDataContext.Branches  
        where b.id = id  
        select b).ToList(); 

你給會導致查詢的代碼中的代碼行hit-獲取所有數據並將其存儲在存儲器中,每次執行。這是因爲你正在使用.ToList()

考慮IQueryable<T>IEnumerable<T> - 這將使用延遲加載(如果啓用),應該只獲得所需的數據。

您可能還想考慮使用SQL事件探查器來查看在數據庫上運行查詢的確切時間。

+0

'.Include(..)'是一個EF功能,對於Linq 2不存在SQL – 2011-03-08 13:17:46

+0

Opps my bad - 已刪除。 – SimonGates 2011-03-08 13:22:43

0

沒有linq-to-sql會延遲加載,除非您另有指定。

如果您還想加載詳細信息,則可以在datacontext上使用Loadoptions。