Linq2SQl энергичная загрузка с несколькими DataLoadOptions - PullRequest
12 голосов
/ 13 марта 2009

Мне нравится получать данные с быстрой загрузкой, используя 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>();

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

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

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

Ответы [ 3 ]

17 голосов
/ 08 сентября 2009

Я столкнулся с этой проблемой и в некотором коде, и после долгих экспериментов и поиска в 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 голосов
/ 13 марта 2009

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

2 голосов
/ 14 марта 2009

По документам:

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

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

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

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