Отключите всю отложенную загрузку или принудительную загрузку для контекста LINQ - PullRequest
14 голосов
/ 02 августа 2010

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

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

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

Ответы [ 2 ]

6 голосов
/ 02 августа 2010

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

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

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

Customers -> Orders -> OrderDetails

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...