2010-08-02 11 views
14

Mam generator dokumentów, który zawiera zapytania dla około 200 elementów, ale najprawdopodobniej wzrośnie do 500 po zakończeniu. Ostatnio zauważyłem, że niektóre mapowania oznaczają leniwe ładowanie. Stanowi to problem dla generatora dokumentów, ponieważ wymaga dostępu do wszystkich tych właściwości w oparciu o to, który dokument jest generowany.Wyłącza wszystkie leniwy ładowanie lub wymuszone ładowanie dla kontekstu LINQ.

Chociaż jestem świadomy DataLoadOptions, który można określić do kontekstu, to spowoduje, że muszę wyraźnie określić każdą kolumnę, która może być załadowana. To jest północ od 1000, ponieważ wszystkie pobieranie danych odbywa się w jednym kontekście.

Czy jest jakiś sposób, aby wyłączyć leniwy załadunek dla kontekstu lub wyraźnie włączyć załadowane ładowanie, aby zignorować funkcję ładowania odroczonego? Być może rozszerzenie klasy kontekstu DB i nadpisanie czegoś?

+0

Ostateczne rozwiązanie: http://gist.github.com/506573 –

Odpowiedz

6

Musisz ustawić DeferredLoadingEnabled, a następnie obejmować każdą personelowi jakieś odbicie jak:

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

co z DeferredLoadingEnabled w kategoriach EF? Czy to jest to samo, co context.ContextOptions.LazyLoadingEnabled = true? – Martin

+0

Właściwości są również w różnych tabelach. Jeśli I iterować je również za pomocą metody "GetProperties()" kontekstu, jak mogę odfiltrować tylko te 'System.Data.Linq.Table'? –

+0

Najprostszym jest sprawdzenie, czy 'pi.PropertyType.Name ==" Table'1 "' –

0

To jest trudne z LINQ to SQL. Krótka odpowiedź brzmi: to zależy.

Jeśli jednostki są ułożone w taki sposób, że masz związek, który odzwierciedla to:

Customers -> Orders -> OrderDetails

i trzeba ocenić właściwości na wszystkich 3 podmioty w celu podjęcia decyzji, twój najlepiej postawić, pisząc dołączyć. Korzystanie z .LoadWith pobierze Customers iza pomocą pojedynczej instrukcji, ale następnie wyda zapytanie dla każdego pojedynczego rekordu OrderDetails.

Tak więc, nawet jeśli określiłeś każdą relację podrzędną z LoadWith, nie otrzymasz pojedynczego zapytania wysłanego w celu pobrania wyniku.

+0

Wszystkie właściwości są tylko na wybranym obiekcie. Po tym fakcie nie będą przestrzegane żadne relacje. –

Powiązane problemy