스키마가 다소 비정규 화되어 있습니다. 다음 테이블을 고려하십시오 연락처가 하나 개 이상의 주소를 가지고, 그들이 회사의 이사입니다Linq에서 평면 계층 구조로 페이징하기
Address
Contact
Company
ContactAddress (ContactId, AddressId)
Director (CompanyId, ContactAddressId)
경우,이 이사 테이블에 두 개의 행이있을 것이다 (각 주소를 - 잠재적으로 항상은 아니지만) .
나는 담당자 인 연락처 목록을 반환해야합니다. 각 담당자에는이 회사의 ContactAddresses 콜렉션이 있습니다.
문제는 100KB 행이므로 (데이터베이스에서 모든 것을로드하는 데별로 신경 쓰지 않습니다.) 주소가 아닌 고유 한 디렉터에서 페이징해야합니다. 그리드의 각 디렉터에는 각 주소에 하나씩 하위 행이 있습니다.
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를 사용하여 엔티티에서 어떻게 할 수 있는지 궁금합니다.
누구나?
도메인 이름으로 - 연락처에 둘 이상의 주소가있을 수 있습니다. 연락처는 둘 이상의 주소에서 회사의 이사가 될 수 있습니다. 회사는 여러 주소에서 여러 명의 이사를 가질 수 있습니다.
해당 주소의 회사 담당자 인 연락처 주소로 그룹화 된 회사의 모든 연락처를 표시합니다.
필자가 가진 가장 가까운는 2 개 질의 패스입니다 ". 단지 작동"이
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()
}
);
나는 복잡성을 충분히 표현했다고 생각하지 않는다. 수정했다. –