Linq to Entities подкачки на плоской иерархии - PullRequest
0 голосов
/ 06 мая 2011

У меня есть схема, которая несколько денормализована.рассмотрим следующие таблицы:

Address
Contact
Company
ContactAddress (ContactId, AddressId)
Director (CompanyId, ContactAddressId)

Если у контакта есть более одного адреса, и он является директором компании, он будет иметь две строки в таблице директора (по одной для каждого адреса - возможно, но невсегда).

Мне нужно вернуть список контактов, которые являются директорами.У каждого Контакта есть коллекция Контактных Адресов для этой Компании.

Проблема в том, что есть строки в 100кс (поэтому я не заинтересован в загрузке всего из БД), но требуется подкачка страниц, т. Е. Для отдельных директоров (не для ихадреса).Каждый директор в сетке будет иметь подстроки по одному для каждого адреса.

например,

Bob Smith
  Acme Company, 1 The Street, London
  Acme Company, 3 The Terrace, Scarborough
Julie Hurts
  Bobbies Bits, 5 Somewhere Land
Sarah Saysno
  BikesRUs, 99 Nowhere land, Nowhere

Изо всех сил пытаюсь понять, как я могу сделать это с помощью чистого Linq to Entities.

Кто-нибудь?

Редактировать В терминах языка домена - контакт может иметь более одного адреса.контакт может быть директором компании по нескольким адресам.у компании может быть несколько директоров по нескольким адресам

Показать все контакты в компании, сгруппированные по адресам контактов, по которым они являются директорами компании по этому адресу.

Ближайший Ive получил двапроход запроса:

var directors = (
                    from companyDirector in ctx.CompanyDirectors
                    join contactAddress in ctx.ContactAddresses
                      on companyDirector.ContactAddress equals contactAddress
                    join contact in ctx.Contacts
                      on contactAddress.Contact equals contact
                    where contact.DisplayName.Contains(searchText)
                          && companyDirector.TypeId == CompanyDirector.DirectorTypeId 
                    orderby contact.DisplayName
                    group companyDirector by new {companyDirector.Company, companyDirector.ContactAddress.Contact}
                      into companyContacts
                    select companyContacts
                  ).Page(pageNumber, pageSize).ToList();


      var query = (
        from director in directors
        select new CompanyDirectorLocations
          {
            CompanyId = director.Key.Company.Id,
            ContactDisplayName = director.Key.Contact.DisplayName,
            Locations = (
                          from companyDirector in ctx.CompanyDirectors
                          where companyDirector.Company == director.Key.Company
                                && companyDirector.ContactAddress.Contact == director.Key.Contact
                                && companyDirector.TypeId == CompanyDirector.DirectorTypeId 
                          select companyDirector.ContactAddress.Address.City
                        ).ToList()
          }
      );

1 Ответ

0 голосов
/ 10 мая 2011

Это "просто работает".Если вы сделаете:

var q = (from c in Context.Contacts
         where c.Director != null
         select new ContactPresentation
         {
             Name = c.Name,
             Addresses = from a in c.Addresses
                         select new AddressPresentation
                         {
                             Company = a.Company,
                             // etc.
         }).Take(3);

... тогда вы получите верхние 3 контакты , а не верхние 3 адреса.

У вас естьпробовал это?

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