У меня есть схема, которая несколько денормализована.рассмотрим следующие таблицы:
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()
}
);