2016-09-29 2 views
0

Entity Framework Core 사용 하위 컬렉션을 포함하는 엔터티를 매핑하려고합니다. without projectTo 생성 된 SQL에는 where 절이 포함되며 하위 컬렉션에 속한 엔터티 만 가져옵니다. 내가 프로젝트를 추가 할 때, 이 맞지만 SQL을 보았을 때 나는 where 절을 볼 수 없다. 자식 유형의 모든 엔티티를로드 한 다음 메모리에서 위치를 나타냅니다. 컬렉션에서 모든 종류의 매핑을 시도했지만 아무 것도이 동작을 변경하는 것 같습니다. 이 쿼리를 향상시킬 수있는 방법이 있습니까?Automapper projectTo 생성 된 SQL에는 where 절이 없습니다.

문제의 코드는 다음과 같습니다

var parent = _context 
       .Parents 
       .Where(a => a.FamilyId == familyId && a.Id == id) 
       .Include(r => r.Children) 
       //.ProjectTo<ParentDetailViewModel>() 
       .AsNoTracking() // In case projection contains sub entities 
       .SingleOrDefault(); 

프로젝트없이 내가 프로파일 러 나는이 볼 프로젝트와

exec sp_executesql N'SELECT [r].[Id], [r].[FieldOne], [r].[Cid], [r].[FieldTwo], [r].[ParentId] 
FROM [Child] AS [r] 
WHERE EXISTS (
    SELECT TOP(2) 1 
    FROM [Parent] AS [a] 
    WHERE (([a].[FamilyId] = @__familyId_0) AND ([a].[Id] = @__id_1)) AND ([r].[ParentId] = [a].[Id])) 
ORDER BY [r].[ParentId]',N'@__familyId_0 int,@__id_1 int',@__familyId_0=1,@__id_1=1 

에서 다음 SQL을 볼 수 있습니다. Where 절은 포함되지 않습니다.

SELECT [r].[ParentId], [r].[Id] 
FROM [Child] AS [r] 

답변

0

분명히 Entity Framework 핵심 버그가 원인입니다. 1.1.0 미리보기에서 수정 됨

1

대개는 경험적으로 구체화하기 전에 ProjectTo를 마지막으로 넣습니다. AsNoTracking 후에 ProjectTo를 넣으십시오 - 그러나 AsNoTracking은 무의미합니다. ProjectTo를 사용하면 엔티티 전체를 건너 뛰고 SQL에서 DTO로 직결되며 엔티티는 전혀 포함되지 않습니다.

또한 포함은 무의미합니다. ProjectTo/Select를 사용하면 EF는 선택 프로젝션에 참여하기 때문에 어떤 엔티티에 참여해야하는지 정확히 알고 있습니다!

+0

DTN에 DTO 객체에 매핑되지 않은 하위 엔티티가있는 경우 Id가 AsNoTracking에 남아 있다고 생각했습니다. 어쨌든 AsNoTracking과 Include를 주석 처리하면 아무런 차이가 없습니다. where 절없이 실행중인 자식을 가져 오는 쿼리를 계속 볼 수 있습니다. – Stephen