2016-09-29 2 views
0

Использование ядра платформы Entity Framework Я пытаюсь отобразить объект, содержащий дочернюю коллекцию. Без проекта. Сгенерированный SQL содержит предложение where и извлекает только объекты, принадлежащие дочерней коллекции. Когда я добавляю projectTo, результат равен, но, глядя на 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(); 

Без проекта я вижу следующий SQL в профилировщике

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 

С проектом я вижу это. Нет, где включено предложение.

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

ответ

0

По-видимому, причиной является ошибка ядра Entity Framework Core. Исправлено в 1.1.0 предварительном просмотре

1

Как общее правило, я поставил ProjectTo в качестве последней вещи перед материализацией запроса. Положите ProjectTo после AsNoTracking - ОДНАКО, AsNoTracking бессмыслен. С ProjectTo вы полностью пропускаете сущности, переходя прямо из SQL в DTO, никаких объектов, участвующих вообще.

Кроме того, Include бессмысленно. С помощью ProjectTo/Select EF точно знает, к каким объектам необходимо присоединиться, потому что они находятся в проекте Select!

+0

Я думал, что Id оставить в AsNoTracking, если у DTO были субильные объекты, которые по какой-то причине не были сопоставлены объектам DTO. В любом случае комментирование как AsNoTracking, так и Include не имело никакого значения. Я по-прежнему вижу запрос на выборку дочерних элементов без предложения where – Stephen

Смежные вопросы