Вы можете сначала загрузить объект Manufacturer
без списка Product
(то есть без вызова Include()
), а затем запустить отдельный запрос, чтобы загрузить только те продукты, которые вам нужны для указанного объекта c Manufacturer
. EF автоматически обновит свойства навигации. См. Следующий пример (авторы могут иметь несколько сообщений в этом примере):
using (var context = new MyContext())
{
Author author = context.Author.First();
Console.WriteLine(context.Post.Where(it => it.Author == author).Count());
context.Post.Where(it => it.Author == author).Take(2).ToList();
Console.WriteLine(author.Posts.Count());
}
Будет получен следующий результат:
3
2
Даже если в моем тесте доступны три записи база данных, фактически читаются только два. См. Сгенерированные запросы SQL:
Для строки Author author = context.Author.First();
:
SELECT `a`.`Id`, `a`.`Name`
FROM `Author` AS `a`
LIMIT 1
Для строки context.Post.Where(it => it.Author == author).Count()
:
SELECT COUNT(*)
FROM `Post` AS `p`
INNER JOIN `Author` AS `a` ON `p`.`AuthorId` = `a`.`Id`
WHERE `a`.`Id` = 1
Для context.Post.Where(it => it.Author == author).Take(2).ToList();
line:
SELECT `p`.`Id`, `p`.`AuthorId`, `p`.`Content`
FROM `Post` AS `p`
INNER JOIN `Author` AS `a` ON `p`.`AuthorId` = `a`.`Id`
WHERE `a`.`Id` = 1
LIMIT 2
Однако вы должны проделать этот трюк для каждой отдельной Manufacturer
сущности, чтобы она загружала только десять связанных Product
сущностей. Это может привести к появлению 1 + N запросов SELECT .