Эффективное получение количества дочерних записей при возврате родительских записей - PullRequest
4 голосов
/ 01 декабря 2011

Я использую 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 или что я хочу несбыточную мечту?

Ответы [ 2 ]

5 голосов
/ 01 декабря 2011

Не уверен, но, возможно, попробуйте это:

var result = db.Categories.Where(x => x.CategoryId == categoryId)
                          .Select(y => new 
                              { 
                                 Count = y.Products.Count(), 
                                 Category = y
                              })
                          .Single();

//result.Count

//result.Category
0 голосов
/ 06 мая 2015

Да, это возможно с EF. Вы также можете создать модель представления для отображения информации с дочерними значениями в качестве свойств. В этой статье описывается, как это сделать.

http://www.ozkary.com/2015/04/entity-framework-associated-table.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...