2012-08-24 2 views
3

나는 Stackoverflow 주위를 둘러 보았고 NHibernate IList vs List와 관련된 몇 가지 질문을 보았다. 내 자신의 질문이 ...NHibernate IList 또는 List?

IList의 목적은 lazyloaded 목록을 갖는 것이므로 저장소에서 반환하는 용도는 무엇입니까? 결국 저장소 호출을 ToList()하면 확실한 객체가 생성됩니까? 그러므로 당신의 메소드가 IList 나 List를 리턴하고 있다면, 더 이상 게으른 로딩이 필요하지 않습니까?

답변

3

저장소가 IQueryable을 반환하면 처음 열거 된 결과가 검색됩니다. ToList()를 호출하면 ToList가 IQueryable을 열거하기 때문에이 순간에 결과를 검색합니다.

이제 지연로드가 반드시이 동작의 영향을받지는 않습니다. 고객 및 주문이 있다고 가정합니다. 각 고객에는 CustomerOrders라는 속성이 있으며,이 속성은 지연로드 됨으로 표시됩니다. 즉, 고객 목록을로드 할 때 각 고객에 대한 CustomerOrders 등록 정보를 열거하면 주문이 검색됩니다. 그냥() 당신의 GetCustomers에() 메소드의 반환 값을 ToList을 할 경우 그래서, 그것은 CustomerOrders의 지연로드에 영향을주지 않습니다

+0

감사합니다. 이것은 내가 확신했던 것이 아니지만, 확실히 옳은 것으로 들립니다. 따라서 항상 IList를 리포지토리 메서드에서 반환하는 습관을 가지는 것이 가장 좋습니다. – MattB

+0

@MattB 게으름 때문에, 당신은'IQueryable' 또는'IEnumerable'을 반환 할 것입니다. 왜냐하면 구체화되기 때문에, 'IList'는 많은 이유에서 의미가 있습니다. 'List '을 포함시킬 특별한 이유가 없습니다 (LINQ 시퀀스의 끝에서''ToList() '를 사용하는 경우는 예외). 그러나이 경우조차도 일관성을 위해'IList '를 반환하기를 원할 것입니다 그리고 결과가 암시 적으로 upcasted하게합시다) (그리고 네, 아마 당신은 아마 지금이 모든 것을 알고 있습니다. 그러나이 대답은 잘못 해석되는 경향이 있습니다. 따라서 내 대답은 ...) –

1

당신은 꽤 많이 맞아요,하지만 내가 할게요 몇 가지 개념을 혼동 그것은 정상에서.

당신은 정확합니다 .ToList()materializes 것.

IList은 구체화 된 목록의 추상 인터페이스 일뿐입니다.

NHibernate는 일 때 IList이 필요합니다. session.QueryOver 등을 사용하는 경우 확장 메소드를 사용하여 IList (구체화 됨) 또는 Future()을 반환하여 IEnumerable (지연)을 반환합니다. QueryOver은 꽤 안정적이며 완벽하며 잘 포장되어 있습니다. Linq의 공급자 측면에서

, 당신은 session.Query 사용하고, 당신도 구체화 된 항목에 대한 게으른 위해, IEnumerable '쿼리의 스펙'또는 IList을 위해 IQueryable 수준에서 머물 수 있습니다. 일반적으로 ToList()을 사용하여 구체화하고 AsEnumerable() (또는 형/형 변환)을 사용하여 IEnumerable이됩니다. NB 나는 LINQ 제공자에 대해 QueryOver를 작성했다는 진술을 할 수 없습니다.

관련 문제