Как вернуть много дочерних коллекций Count () в запросе фреймворка с одной сущностью

У меня есть две сущности, родительская и дочерняя в Entity Framework.

У родителя есть набор дочерних сущностей.

В моем запросе я хочу вернуть только родительские сущности (полностью типизированные типы EF), а также Count () дочерних сущностей (для этого можно задать свойство в родительском элементе), но я хочу сделать это только в один вызов базы данных, без написания пользовательского S-Proc. Это возможно?

Важно, я хочу превратить это в один запрос:

EFContext content = new EFContext();
IQueryable<Parent> parentQuery = context.Parent.Select();
foreach(Parent parent in parentQuery)
{
  parent.NoChildItems = parent.Childs.Count();
}

Когда я активирую перечислитель для этого, он вызывает базу данных для списка и снова для каждого запроса Count (). Я возвращаю примерно 100 элементов каждый раз и поэтому предпочел бы не делать 100 отдельных вызовов только для количества дочерних элементов.

Спасибо за любую помощь.


person James    schedule 10.01.2010    source источник


Ответы (1)


Это должно работать:

IQueryable parentQuery = context.Parent.Select(p => new { Parent = p, ChildCount = p.Childs.Count() });

ИЗМЕНИТЬ

Если вы определите:

public class ParentModel
{
    public Task Parent { get; set; }
    public int ChildCount { get; set; }
}

ты можешь использовать

IQueryable parentQuery = context.Parent.Select(p => new ParentModel { Parent = p, ChildCount = p.Childs.Count() });

ИЗМЕНИТЬ

Вы также можете:

var parentQuery = context.Parent.Select(p => new { Parent = p, ChildCount = p.Childs.Count() }).ToList();
parentQuery.ForEach(p => p.Parent.ChildCount = p.ChildCount);
var result = return parentQuery.Select(p => p.Parent);

Коротко, и у вас есть заселение.

person LukLed    schedule 10.01.2010
comment
Спасибо за ответ, но есть ли способ сделать это без использования анонимного класса? - person James; 10.01.2010
comment
Думал, ты собираешься это сказать! Неважно, спасибо за вашу помощь. - person James; 10.01.2010
comment
Вышеупомянутое решение, но приводит к нескольким вызовам db. Как можно получить счетчик за один вызов для всех записей в ParentModel? - person Robin Kedia; 07.08.2017
comment
@RobinKedia Это может не привести к множественным вызовам БД в EF6. - person LukLed; 10.08.2017