Entity Framework LINQ эквивалент T SQL для включения количества дочерних записей - PullRequest
0 голосов
/ 05 мая 2020

Используя Entity Framework и LINQ, как я могу достичь этого T SQL:

SELECT Children.ChildCount, Parent.*
FROM Parent
LEFT JOIN (SELECT ParentID, COUNT(ChildID) AS ChildCount FROM Child GROUP BY ParentID) AS Children 
ON Parent.ID = Children.ParentID

Обратите внимание, что это лишь небольшая часть того, что уже является большим запросом LINQ, который включает другие связанные сущности, поэтому использование запроса Raw SQL не подходит. Также в родительской таблице около 20 столбцов, и я надеюсь, что не придется указывать каждый отдельно, чтобы код оставался поддерживаемым.

EDIT : Чтобы прояснить пару вещей, модель результат запроса (очень упрощенный) выглядит примерно так:

public class MyEntity
{
    public int ID {get; set;}
    public string Name {get; set;}
    public int ChildCount {get; set;}
    // many other properties here including related records
}

Итак, я пытаюсь включить ChildCount в результат запроса, чтобы он был включен в сущность EF .

Ответы [ 2 ]

1 голос
/ 13 августа 2020
• 1000 у меня есть сопоставление AutoMapper:
     CreateMap<MyEntity, MyEntityDTO>()
           .ForMember(d => d.ChildCount, opt => opt.MapFrom(src => src.ChildEntity.Count()))

Затем на моем уровне обслуживания я вызываю:

      IEnumerable<MyEntityDTO> results = await dbContext.MyEntities.ProjectTo<MyEntityDTO>(mapper.ConfigurationProvider).ToListAsync();
1 голос
/ 05 мая 2020

Вы можете использовать запрос выбора для проецирования информации БД на объект, например:

var entity = db.Parent.Select(x => 
    new MyEntity
    {
        Id = x.Id,
        Name = x.Name,
        ChildCount = x.Children
            .Select(y => y.ParentId == x.Id)
            .Count()
    })
    .SingleOrDefault(x => x.Id == IDYouNeedToQuery);
}

Это должно вернуть вам 1 экземпляр вашего класса MyEntity с именем, идентификатором , и свойства ChildCount заполнены. Ваш SQL не совсем соответствует сгенерированному, но это должно дать вам то, что вы хотите. Кстати, вы также можете добавить строку SingleOrDefault с фильтром другого типа или без фильтра, и в этом случае переменная entity становится коллекцией MyEntity.

Чтобы узнать больше об этой технике и о том, как использовать AutoMapper, чтобы упростить настройку, ознакомьтесь с этим сообщением от Джона П. Смита, который буквально написал книгу о Entity Framework Core. .

Надеюсь, это поможет.

...