2010-02-11 4 views
2

나는 다음 쿼리와 컬렉션을 검색 :엔티티 프레임 워크 : 그룹별로 탐색 속성이 사라지는 이유는 무엇입니까?

var numbers = _betDetailItem.GetBetDetailItems().Where(betDetailItem => betDetailItem.BetDetail.Bet.DateDrawing == resultToCreate.Date && betDetailItem.BetDetail.Bet.Status == 1).Where(condition); 

을 마우스 오른쪽이 내 탐색 속성에 액세스 및 바인더 제본 정보를 탐색 할 수 있어요. 실제로 데이터를 필터링하는 데 실제로 어떻게 사용되는지 유의하십시오.

결과를 그룹화하면 탐색 속성이 null이됩니다.

var grouped = numbers.GroupBy(p => p.BetDetail.Bet); 
//Iterate through the collection created by the Grouping 
foreach (IGrouping<Bet, BetDetailItem> group in grouped) 
{ 
    var details = group.Key.BetDetails; //This is what doesn't work. BetDetails is a navigation property which was accessible in the previous query. 
} 

내가 잘못하고 있나? 당신이 GroupBy()을하면

+0

그렇지 않습니다. 당신의 게시물에없는 뭔가가 여기에 있습니다. 모든 사용자 지정 코드없이 Northwind에 대해 간단한 쿼리를 시도하십시오. 작동시키지 못하면 여기에 게시하십시오. –

+1

다른 ORM과 같이 작동하지 않는 이유는 무엇입니까? –

+0

내가 말했듯이, 귀하의 질문은 잘못된 전제에 근거한다고 생각합니다. 내가 제안한 것을 시도 했니? –

답변

1

엔티티 및 개체 작업에 LINQ를 혼동스럽게합니다.

var grouped = numbers.GroupBy(p => p.BetDetail.Bet); 

이 객체 작업은 다음과 같습니다 :

var numbers = _betDetailItem.GetBetDetailItems().Where(betDetailItem => betDetailItem.BetDetail.Bet.DateDrawing == resultToCreate.Date && betDetailItem.BetDetail.Bet.Status == 1).Where(condition); 

그래서 이것이다 :

는 엔티티에 LINQ이다 엔티티에 LINQ에서

foreach (IGrouping<Bet, BetDetailItem> group in grouped) 
{ 
    var details = group.Key.BetDetails; //This is what doesn't work. BetDetails is a navigation property which was accessible in the previous query. 
} 

, 어떤 필요가 결코 관련 인스턴스를로드하는 것에 대해 생각할 수 있습니다. 모든 객체의 속성을 항상 참조 할 수 있습니다. 그러나 어느 시점에 IQueryable<BetDetail> 대신 BetDetail 형식의 인스턴스로 작업하기를 원하기 때문에 LINQ to Entities 세계와 개체 공간으로 이동하려고합니다. 즉, 이제 Entity Framework에서 데이터베이스에서 데이터를 검색하기 위해 SQL을 생성해야합니다. 이 시점에서 나중에 코드에서 액세스 할 관련 인스턴스가 눈에 띄지 않습니다. LINQ to Entities 쿼리에서 아무 것도 관련로드를 강제 실행하지 않습니다. Bet. 따라서 열심히로드, 명시 적로드 또는 EF 4 지연로드를 사용하는 것과 같은로드를 유발하는 작업을 수행하지 않으면로드되지 않습니다.

느린 로딩 (예 : Entity Framework 4 또는 다른 ORM)을 사용하면이 코드 이 작동하려면이 표시되지만 많은 수의 데이터베이스 쿼리가 생성되어 불필요하게 느려집니다. 더 나은 해결책은 eager loading 또는 projection을 사용하는 것입니다. 이렇게하면 단 한 번의 DB 왕복이있을 것입니다.

1

, 당신은 더 이상 개체를 처리하지거야 - 그들은 잘 그룹화되었습니다 ..., 그래서 var grouped = ...var 유형 IEnumerable<IGrouping<...의 지금이다. 따라서 grouped 컬렉션의 항목에서 사용할 수있는 메서드는 IGrouping<> 인터페이스의 메서드입니다.

당신은 당신의 필요에 따라, OrderBy() 대신 GroupBy() 할 수 있습니다, 또는 당신은 두 가지 수준에서 반복해야합니다 : grouped 각 그룹을 반복, 그리고 그 각각 내 각 구성원을 통해.

특정 IGrouping<>의 내부에 있으면 찾고있는 속성에 액세스 할 수 있어야합니다.