2010-08-04 9 views
1

에 자식 목록로드 LINQ to SQL 요청을 최적화하여 단일 SQL 문을 생성하려고합니다.열심히 LINQ to SQL

편집 : 순간 나는 이런 일이 명확성을 위해 "여기서"필터 제거 - 또한 "ID" 두 오브젝트 유형에 대한 databsse의 기본 키를

hotel = (from h in db.Hotels 

     let rooms = (from r in db.HotelRooms 
         where r.HotelId == h.Id 
         select new HotelRoom 
         { 
          Id = r.Id, 
          Code = r.Code, 
          Category = r.Category 
         }) 

     select new Hotel 
     { 
      Id = h.Id, 
      Name = h.Name, 
      Rooms = rooms.ToList() 
     }).FirstOrDefault(); 

호텔 비즈니스 레벨 클래스는 다음과 같이 정의되는 경우 :

public class Hotel 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public List<HotelRoom> Rooms { get; set; } 
} 

쿼리가 사업을 OBJE을 만들 이니셜 라이저를 사용하는 것을 특징 cts는 쿼리가 실행될 때 DataContext 엔터티에서 즉시 수행됩니다.

Rooms 컬렉션의 .ToList()은 분명히 두 번째 쿼리를 통해 Hotel.Rooms 컬렉션을 채우게됩니다.

추가 쿼리를 생성하지 않고 Hotel.Rooms 속성을 모든 HotelRooms로 채울 수 있습니까?

답변

0
//grab the rows from the database in direct fashion. 
var joinedRows = 
(
    from h in db.Hotels 
    where h.Name == name 
    from hr in h.HotelRooms 
    select new {HotelRow = h, HotelRoomRow = hr} 
) 
.ToList(); 

    //shape the data locally 
List<Hotel> result = 
    from row in joinedRows 
    group row.HotelRoomRow by row.HotelRow into g 
    let h = g.Key 
    select new Hotel() 
    { 
    Id = h.Id, 
    Name = h.Name, 
    Rooms = (
     from r in g 
     select new HotelRoom() 
     { 
     Id = r.Id, 
     Code = r.Code, 
     Category = r.Category 
     }).ToList() 
    }; 
+0

감사합니다. 그러나 이것은 1 개의 HotelRoom이있는 1 개의 호텔을 데이터베이스의 각 HotelRoom에 반환하는 것으로 보입니다. 따라서 10 개의 호텔이 있고 각각 10 개의 객실이있는 경우 1 개의 객실마다 100 개의 호텔 항목이 반환됩니다. – krisg

+0

죄송합니다 - 뭔가 명확히하기 위해 - 위의 코드를 변경하여 "name =="조건을 제거하여 특정 호텔이 아닌 모든 호텔을 검색했습니다. 그것이 데이터베이스의 모든 호텔을 반환하는 이유입니다. 문제는 내가 제기 한 문제가 아닙니다. 문제는 여전히 모든 호텔 객실에 대해 1 개의 호텔 개체를 반환한다는 것입니다. 각 호텔 개체에는 1 개의 객실 만 있습니다. – krisg

+0

"데이터를 로컬로 처리"부분에서이를 해결합니다. –