Подтвердить что ты не робот

Linq2SQl загружает несколько DataLoadOptions

Мне нравится получать данные с помощью загрузки с помощью Linq2SQL. Код аналогичен:

       DataLoadOptions options = new DataLoadOptions();

       options.LoadWith<Product>(c => c.ProductCompanies);

       options.LoadWith<Product>(c => c.OrderDetails);

       db.LoadOptions = options;

       IEnumerable<Product> products = db.Products.ToList<Product>();

Я проверяю, что он сгенерировал более одного SQL-запроса, как я ожидал. На самом деле, он загружает только Product и OrderDetails, а ProductCompany запрашивается один за другим. Я сделал что-то не так? Или это проблема Linq2SQL? У нас есть обходное решение?

Спасибо большое!

Update: Я проверяю sql из SQL Profiler. Я нашел, что и Леппи, и Ян прав. Они ограничены в одной транзакции. Но когда я установил его как ленивую загрузку, он открыл несколько соединений.

4b9b3361

Ответ 1

Нет, вы не сделали ничего плохого, Linq2SQL портирует все в одной транзакции, но может выполнить неограниченное количество запросов для требуемого результата. DataLoadOptions обычно используется только тогда, когда DataContext недоступен для всего контекста результирующего использования. Если вы можете сохранить DataContext живым во время выполнения, лучше полагаться на отложенное выполнение (по умолчанию).

Ответ 2

Я тоже попал в эту проблему в некоторый код, и после много экспериментов и поиска в Google выглядит так: LINQ может объединяться только через одно отношение "один ко многим" из каждой таблицы: если вы попытаетесь указать более одного на предварительную загрузку он просто (случайно?) выбирает, какой из них нужно предварительно загрузить, а какие остальные оставить отложенными (просто игнорируя подсказки LoadWith)

Другие люди также разместили это, например

http://codebetter.com/blogs/david.hayden/archive/2007/08/06/linq-to-sql-query-tuning-appears-to-break-down-in-more-advanced-scenarios.aspx

Ответ 3

Согласно документам:

Когда вы запрашиваете объект, вы фактически получаете только запрошенный объект. Связанные объекты автоматически не загружаются одновременно.

Класс DataLoadOptions предоставляет два метода для немедленной загрузки указанных связанных данных. Метод LoadWith позволяет мгновенно загружать данные, относящиеся к основной цели. Метод AssociateWith позволяет фильтровать связанные объекты.

Несколько операторов sql меня не удивляют. Я думаю, что разница здесь - все заявления просто загружены спереди, а не лениво загружают их по требованию.