2017-01-12 1 views
1

EntityFramework를 사용하여 DB 엔터티의 중첩 목록을 채우기 위해 단일 LINQ 쿼리 만 사용하고 싶습니다.EF6 중첩 목록에 대한 단일 LINQ 쿼리

3 개의 테이블 엔티티가 있습니다. 퍼스트 클래스 CitiesList<Houses>이고 HousesList<Residents>입니다.

그 클래스 :

var cities = (from city in db.Cities 
       select new // Creating anonymous type to fill List of Houses 
       { 
        CityId = city.CityId, 
        Name = city.Name, 
        Houses = db.Houses.Where(h=>h.CityId == city.CityId) 
            .Select(new // Another anonymous type, but this time this isn't working 
            { 
             HouseId = h.HouseId, 
             Address = h.Address, 
             Residents = db.Residents.Where(r=>r.HouseId == h.HouseId).ToList() 
            }).ToList() 
            .Select(h => new Houses 
            { 
             HouseId = h.HouseId, 
             Address = h.Address, 
             Residents = h.Houses 
            }).ToList() 
       }) 
       .ToList() 
       .Select(c=> new Cities 
       { 
        CityId = c.CityId 
        Name = c.Name, 
        Houses = c.Houses 
       }).ToList() 

불행하게도 나는 오류 The entity or complex type Houses cannot be constructed in a LINQ to Entities 무엇입니까 :

class Cities 
{ 
    long CityId {get;set;} 
    string Name {get;set;} 
    List<House> Houses {get;set;} 

} 

class Houses 
{ 
    long CityId {get;set;} 
    string Address {get;set;} 
    List<Resident> Residents {get;set;} 

} 

class Residents 
{ 
    long HouseId {get;set;} 
    string FirstName {get;set;} 
    string LastName {get;set;} 
} 

내가 달성하고자하는 것은이 같은 것입니다.

그것은 단지 Houses = db.Houses.Where(h=>h.CityId ==city.CityId).ToList()에 대해 작동합니다. 하지만 그걸로 을 Houses에 풀고 있습니다.

하나의 LINQ 쿼리로 할 수 있습니까?

+0

당신이 LINQ 쿼리로 DB에 쓰기를 시도하고 있습니까? – Piou

+1

'거주자 = h.Houses'는 오타가되어야합니다. 또한 단일 클래스 이름을 사용하는 것이 좋습니다. –

답변

5
당신은 당신의 도시 쿼리에 주택과 주민을 포함 할 필요가

:

var cities = db.Cities.Include(c => c.Houses.Select(h => h.Residents)).ToList(); 
+1

엔티티 유형을 반환해도 괜찮은 경우 실제로 가장 좋습니다. 익명 형식으로의 선택이'Include' 다음에 그리고'ToList' 전에 수행되면 작동하지 않을 것입니다. ** 편집 ** 엔티티 객체가 익명 형식으로 재구성 되었기 때문에 내 발언은 다소 중복됩니다. – grek40

+1

@ Sergey_Berezovskiy : 감사합니다. 제대로 탐색 속성을 만드는 데 약간의 문제가 있었지만 이후에는 모든 작업이 훌륭했습니다! – Wiktor

0

당신은 아닌 별도의 db 접근, 탐색 속성을 사용한다

var Cities = (from city in db.Cities 
      select new // Creating anonymous type to fill List of Houses 
      { 
       CityId = city.CityId, 
       Name = city.Name, 
       Houses = city.Houses.Select(new 
           { 
            HouseId = h.HouseId, 
            Address = h.Address, 
            Residents = h.Residents.ToList() 
           }).ToList() 
           .Select(h => new Houses 
           { 
            HouseId = h.HouseId, 
            Address = h.Address, 
            Residents = h.Houses 
           }).ToList() 
      }) 
      .ToList() 
      .Select(c=> new Cities 
      { 
       CityId = c.CityId 
       Name = c.Name, 
       Houses = c.Houses 
      }).ToList() 

이 전체 구문을 확인하지 않았다, 단지 (Residents와 같은) city.Houses에 의해 db.Houses.Where(...) 교체, 그래서 다른 문제가있을 수 있습니다.