2011-05-06 6 views
0

스키마가 다소 비정규 화되어 있습니다. 다음 테이블을 고려하십시오 연락처가 하나 개 이상의 주소를 가지고, 그들이 회사의 이사입니다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() 
      } 
    ); 

답변

0

당신이 할 경우

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 주소를 얻는다.

시도해 보셨습니까?

+0

나는 복잡성을 충분히 표현했다고 생각하지 않는다. 수정했다. –

관련 문제