Я использую Entity Framework 4.1, используя подход Code First.У меня есть две сущности, которые показывают отношения родитель-ребенок.Чтобы привести конкретный пример, представьте, что у меня есть сущность Category
, с которой связаны ноль-ко-многим Product
сущности.Я настроил навигационные свойства с обеих сторон (в моем примере у сущности Category
будет свойство ICollection<Product>
, а у сущности Product
свойство Category
).
Теперь, когда я получаю Category
сущностей, я хочу также получить count количества дочерних записей для каждой категории.Я знаю, что могу сделать:
Category category = dbContext.Categories.Single(...);
int productCount = category.Products.Count();
Но я обеспокоен, потому что полученный SQL, который отправляется в базу данных, зависит от того, использую я ленивую или энергичную загрузку.
В первом случае (ленивая загрузка) вызов коллекции Products
побуждает EF выполнить SQL-запрос, например:
SELECT ... all columns ...
FROM Products
WHERE CategoryID = @CategoryID
Во втором случае (жадная загрузка),продукты загружаются при получении информации о категории, поэтому второй запрос к базе данных отсутствует, но недостатком является то, что если я вообще не заинтересован в продуктах (кроме их количества), то я возвращаю многоненужные данные.
То, что я хотел бы, чтобы у них было лучшее из обоих миров: а именно, возможность иметь только один запрос к базе данных и тот, который использует SELECT COUNT(*)
вместо того, который получает все столбцы изстол.Короче говоря, я бы хотел, чтобы SQL, например, отправлял в базу данных следующее:
SELECT ... all category columns ...,
(SELECT COUNT(*) FROM Products p WHERE p.CategoryID = c.CategoryID)
FROM Categories c
WHERE c.CategoryID = ...
Это вообще возможно с EF или что я хочу несбыточную мечту?