2010-08-02 2 views
14

У меня есть генератор документов, который содержит запросы для примерно 200 элементов на данный момент, но, вероятно, будет превышать 500 по завершении. Недавно я заметил, что некоторые из отображений обозначают ленивую загрузку. Это создает проблему для генератора документов, поскольку для этого требуется доступ ко всем этим свойствам на основе того, какой документ создается.Отключить всю ленивую загрузку или принудительную загрузку для контекста LINQ

Хотя мне известно о DataLoadOptions, которое может быть указано в контексте, это приведет к тому, что я должен явно указать каждый столбец, который может быть загружен. Это к северу от 1000, так как все данные извлечения данных происходят в одном контексте.

Есть ли способ отключить ленивую загрузку контекста или явно разрешить загрузку, чтобы игнорировать свойство отложенной загрузки? Возможно, расширение класса контекста ББ и переопределение чего-то?

+0

Окончательное решение: http://gist.github.com/506573 –

ответ

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

btw, что такое DeferredLoadingEnabled в условиях EF? Это то же самое, что и context.ContextOptions.LazyLoadingEnabled = true? – Martin

+0

Все объекты находятся в разных таблицах. Если я тоже повторяю их с помощью метода GetProperties() 'контекста, как я могу отфильтровать только те' System.Data.Linq.Table'? –

+0

Проще всего проверяется, будет ли 'pi.PropertyType.Name ==" Table'1 "' –

0

Это сложно с помощью LINQ к SQL. Короткий ответ, это зависит.

Если ваши объекты раскладывают таким образом, что у вас есть отношения, отражающее это:

Customers -> Orders -> OrderDetails

И вы должны оценить свойства на всех 3-х лицо, с тем, чтобы принять решение, ваш Лучше всего пойти с письмом. Используя .LoadWith, вы получите Customers и Orders, используя один оператор, но затем выдаст запрос для каждой записи OrderDetails.

Таким образом, даже если вы указали все дочерние отношения с LoadWith, вы не получите ни одного запроса, выданного для получения результата.

+0

Все свойства находятся только на выбранном объекте. После этого не будет никаких отношений. –

Смежные вопросы