Отключить всю ленивую загрузку или принудительную загрузку для контекста 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, вы не получите один запрос, выданный для получения результата.