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로 채울 수 있습니까?
감사합니다. 그러나 이것은 1 개의 HotelRoom이있는 1 개의 호텔을 데이터베이스의 각 HotelRoom에 반환하는 것으로 보입니다. 따라서 10 개의 호텔이 있고 각각 10 개의 객실이있는 경우 1 개의 객실마다 100 개의 호텔 항목이 반환됩니다. – krisg
죄송합니다 - 뭔가 명확히하기 위해 - 위의 코드를 변경하여 "name =="조건을 제거하여 특정 호텔이 아닌 모든 호텔을 검색했습니다. 그것이 데이터베이스의 모든 호텔을 반환하는 이유입니다. 문제는 내가 제기 한 문제가 아닙니다. 문제는 여전히 모든 호텔 객실에 대해 1 개의 호텔 개체를 반환한다는 것입니다. 각 호텔 개체에는 1 개의 객실 만 있습니다. – krisg
"데이터를 로컬로 처리"부분에서이를 해결합니다. –