Загрузка связанных объектов без нескольких вызовов базы данных - PullRequest
1 голос
/ 09 июля 2010

Я только изучаю LINQ to SQL и натолкнулся на следующее препятствие.

У меня есть следующие 3 таблицы:

  1. PC (PCGUID, ParentPCGUID, ModelName, RetailerGUID)
  2. Предложение (OfferGUID, ParentGUID, Название)
  3. Розничный продавец (RetailerGUID, Имя)

При следующих отношениях:

  1. ПК 1: N Предложение
  2. Розничный продавец 1: N ПК
  3. Розничный продавец 1: N Предложение
  4. ПК 1: N ПК (самоссылка)

Мне нужно получить записи с ПК только с 1 записью с ПК. Предложение (с конкретными предложениями where) и только 1 запись с ПК.Retailer.Offer (с конкретными предложениями where) и, надеюсь, только с одним нажатием набаза данных.

У меня есть следующий запрос (я пробовал около ста), но он попалДБ несколько раз.

    var q = from pc in PCs
        where pc.PCGUID == guid || pc.ParentPCGUID == guid
        select new { 
            PC = pc,
            PCOffers = pc.Offers.FirstOrDefault(),
            RetailOffers = pc.Retailer.Offers.FirstOrDefault()
        };

Если я приведу только одно свойство таблицы предложений, например, так:

    var q = from pc in PCs
        where pc.PCGUID == guid || pc.ParentPCGUID == guid
        select new { 
            PC = pc,
            PCOffers = pc.Offers.FirstOrDefault().Title,
            RetailOffers = pc.Retailer.Offers.FirstOrDefault().Title
        };

Он работает просто отлично и только один раз попадает в БД, но мне нужновесь объект предложения.Любая помощь будет принята с благодарностью.

Спасибо

1 Ответ

0 голосов
/ 09 июля 2010

Возможно, вы захотите попробовать что-то подобное, но я не уверен, что это поможет.

YourDataContext db = new YourDataContext();
db.DeferredLoadingEnabled = false;

DataLoadOptions loadOptions = new DataLoadOptions(); 
loadOptions.LoadWith<PC>(p => p.Offers); 
loadOptions.LoadWith<PC>(p => p.Retailer); 
loadOptions.LoadWith<Retailer>(r => r.Offers); 

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