2010-08-02 69 views
14

我有一個文件生成包含查詢,以目前約200個項目,但可能會是500向上時完成。我最近注意到一些映射表示延遲加載。這對文檔生成器提出了一個問題,因爲它需要根據正在生成的文檔來訪問所有這些屬性。禁用所有延遲加載或強制預先加載了LINQ方面

雖然我知道可以指定給上下文的DataLoadOptions,但這會導致我不得不顯式指定可能可以加載的每列。這是在1000以北,因爲所有的數據獲取發生在一個上下文中。

有什麼辦法,我要禁用延遲加載上下文或明確地啓用預先加載忽略了延遲加載的財產?也許擴展DB上下文類並重寫某些內容?

+0

最終的解決方案:http://gist.github.com/506573 – 2010-08-03 15:42:32

回答

6

您將需要設置DeferredLoadingEnabled,然後包括使用一些反射像每一個屬性:

DataLoadOptions dataLoadOptions = new DataLoadOptions(); 

foreach (PropertyInfo pi in typeof(SomeThingyClass).GetProperties()) 
{ 
    ParameterExpression paramExp = Expression.Parameter(typeof(SomeThingyClass), "s"); 
    Expression expr = Expression.Convert(Expression.Property(paramExp, pi.Name), typeof(object)); 
    LambdaExpression lambda = Expression.Lambda(expr, paramExp); 
    dataLoadOptions.LoadWith((Expression<Func<SomeThingyClass, object>>) lambda); 
} 
+1

順便說一句,什麼在EF方面DeferredLoadingEnabled?它是否與context.ContextOptions.LazyLoadingEnabled = true相同? – Martin 2010-08-02 14:05:37

+0

屬性也都在不同的表中。如果我使用上下文的'GetProperties()'方法迭代它們,我怎樣才能過濾掉'System.Data.Linq.Table'? – 2010-08-02 14:12:47

+0

最簡單的方法是檢查'pi.PropertyType.Name =='表'1「' – 2010-08-02 14:53:45

0

這是棘手的LINQ到SQL。簡短的答案是,這取決於。

如果你的實體的方式佈置,使得你有反映此一關係:

Customers -> Orders -> OrderDetails

而你需要以評估在所有3個實體的屬性做出決定,你的最好的辦法是去寫一個連接。使用.LoadWith將使用一個單獨的語句獲取CustomersOrders,但隨後會發出爲每一個OrderDetails記錄的查詢,以及。

所以,即使你沒有指定用LoadWith每一個孩子的關係,你不會得到發出檢索結果的單個查詢。

+0

所有屬性都只在被選中的對象上。事實之後不會有任何關係。 – 2010-08-02 14:29:08