문제

실제로 쿼리를 실행하지 않고 Lazy Load 중첩 목록은 어떻게합니까? 매우 기본적인 예를 사용하여 다음과 같이 말합니다.

class CityBlock {
     IList<Building> BuildingsOnBlock;
     Person BlockOwner;
}

class Building {
     IList<Floor> FloorsInBuilding;
}

class Floor {
     IList<Cubicle> EmployeeCubicles;
}

Class Cubicle {
     System.Guid CubicleID;
     Person CubicleOccupant;
}

그런 다음 저장소 계층에는 다음과 같은 방법이 있습니다.

GetCityBlocks()

그리고 서비스 계층에서 나는 GetCityBlocksByOwner를 가질 수 있습니다. 여기서 확장 방법을 사용하여 특정 사람이 소유 한 도시 블록을 얻을 수 있습니다. 우리는 Guido의 블록을 원한다고 말합니다.

GetCityBlocks().ForOwner("Guido")

저장소에서 .tolist ()를 수행하면 쿼리를 실행할 것입니다. 우리가 그 수준에서 누가 받고 있는지 알지 못하기 때문에 우스운 일입니다. 따라서 문제는 어떻게 우리가 이것을 효율적으로 수행합니까?

50000 블록 소유자가 있고 1000000 개의 도시 블록이 있다고 가정 해 봅시다. iqueryables를 사용하는 것은 둥지로 인해 작동하지 않습니다 (적어도 내가 알고있는 극도의 해킹없이). 또한 Rob Conery의 Lazylist와 같은 것을 사용하려고하면 DAL에서 도메인 모델로 누출되어 미래에 매우 나빠질 수 있습니다.

그렇다면이 작업을 정확하게 수행하려면 어떻게해야합니까?

  • 올바른 맥락을 결정하는 문제입니까? 그렇다면 저장소 계층 또는 서비스 계층 에서이 작업을 수행합니까?
  • 서비스 계층과 저장소 계층을 반 결합하여 매우 구체적인 서비스 방법을 얻습니까?
  • 아니면 내가 완전히 빠진 것이 있습니까? (여전히 Linq2SQL에 비교적 새로운, 어쨌든 단계적으로 나오는 것 ...)

편집하다:리포지토리 패턴에서 현재 도메인 객체에 매핑하므로 다음과 같이 보일 것입니다.

public IQueryable<CityBlock> GetCityBlocks(){
    var results = from o in db.city_blocks
                  let buildings = GetBuildingsOnBlock(o.block_id)
                  select new CityBlock {
                      BuildingsOnBlock = buildings,
                      BlockOwner = o.block_owner
                  };
    return results;
}

이것이 작동하기 위해서는 CityBlock 객체의 실제 필드를 iqueryable으로 만들지 않는 한, 건물이 .tolist ()를 얻도록해야합니다. CityBlock.buildingsonBlock 필드에 액세스하는 사람에게 부여. 이 매핑 도메인 개체에 대한 매핑이 서비스 계층에서해야 할 일입니까?

도움이 되었습니까?

해결책

당신은 ilist 대신 iqueryables를 반환하여 그것을합니다.

tolist ()는 쿼리가 즉시 실행되도록합니다. 왜냐하면 변환은 iqueryable에서 ilist 로의 변환을 수행해야하기 때문입니다.

IQueryables Lazy Loading을 반환하는 한 데이터가 실제로 필요할 때까지 실행을 연기해야합니다. 즉, Tolist ()가 호출 될 때.

현재 참조를 찾을 수는 없지만 Linq에서 SQL에서 SQL을 통해 SQL을 최적화 할 수있는 기회가 있다는 것은 내 이해입니다. 다시 말해, 궁극적으로 다음은 다음과 같습니다.

GetCityBlocks().ForOwner("Guido")

이 기록 대신 :

GetCityBlocks()

다른 팁

도메인 객체를 매핑하여 작동하도록 다른 접근법을 시도 할 수 있습니다. 문제는 자신이 무엇을하든 (도메인 객체의 iqueryables로 목록을 변경하지 않는 한) 매핑하는 동안 tolist ()를 끝내게된다는 것입니다.

다른 방법으로 Linq2SQL이 사용자 정의 데이터 콘텍스트를 작성하고 매핑에 디자이너를 사용하지 않음으로써 POCO에 매핑을 할 수 있도록하는 방법 :), 이렇게하면 도메인 모델을 깨끗하게 유지하고 Linq2SQL이 올바른 시간에 종속성을 채울 수 있도록합니다. 이 경로로 들어가는 데는 고유 한 문제가 있지만 수행 할 수 있습니다.

이 경로에서 시작할 수있는 링크가 있습니다.

LINQ에서 SQL에서 POCO S를 달성합니다

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top