Отключить всю ленивую загрузку или принудительную загрузку для контекста LINQ

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

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

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

Ответы

Ответ 1

Вам нужно будет установить 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);
}

Ответ 2

Это сложно с LINQ to SQL. Короткий ответ, это зависит.

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

Customers -> Orders -> OrderDetails

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

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