1

"코드 전용"(SQL Server 2008 사용)으로 된 Entity Framework CTP 5를 사용하고 있습니다. 엔티티가 DbContext에서 리턴 된 다음 하위 컬렉션에 액세스 한 다음 하나의 항목을 선택합니다.SingleOrDefault가 사용될 때 Entity Framework에서 생성되는 SQL에 "Where"를 추가하지 않는 이유는 무엇입니까?

Question currentQuestion = currentTopic.Questions.SingleOrDefault(x => x.IsCurrent); 

이 다음과 같은 SQL을 생성합니다 : 내 "대해 IsCurrent"제한이 전혀

SELECT 
[Extent1].[Id] AS [Id], 
[Extent1].[CreatedAt] AS [CreatedAt], 
[Extent1].[IsCurrent] AS [IsCurrent], 
[Extent1].[Xml] AS [Xml], 
[Extent1].[TopicId] AS [TopicId] 
FROM [dbo].[Questions] AS [Extent1] 
WHERE [Extent1].[SessionId] = 24 

를 참조되지 여기 내 LINQ 문입니다. IsCurrent는 데이터베이스의 비트 필드입니다.

이유가 누구인지 설명 할 수 있습니까? 엄청난 성능 저하를 초래합니다.

+0

확실하지 않습니다 ... x => x.IsCurrent == true – rene

답변

4

이것은 모든 EF 구현에서 설계된 것입니다. 질문 모음에서 IEnumerable<Question>은 (는) IQueryable<Question>이 아닙니다. 질문 등록 정보에 액세스하면 게으른로드가 트리거되고 모든 관련 질문이로드됩니다. 그런 다음로드 된 컬렉션의 SingleOrDefault으로 전화하십시오.

당신은 단지 하나의 문제는 대신이 쿼리를 실행하려면 : 자식 컬렉션 (currentTopic.Questions)이 유유히 완전히를로드하기 때문에 내가 생각

var question = context.Questions 
       .SingleOrDefault(q => q.Session.Id == sessionId && q.IsCurrent); 
2

을 다음 LINQ는 SingleOrDefault의 버전을 Object로 아닌 LINQ 엔티티에게 엔티티는 컬렉션에서 호출됩니다.

게시 한 SQL 문에 WHERE [Extent1].[SessionId] = 24이 포함되어 있습니다. 현재 Topic에 대한 모든 질문을로드 중임을 보여줍니다.

관련 문제