Как получить счетчик списка в модели Entity Framework без включения / загрузки всей коллекции? - PullRequest
0 голосов
/ 22 мая 2018

У меня есть модель в Entity Framework Core, которая выглядит примерно так:

public class Anime
{
     public int EpisodeCount { get { return Episodes.Count() } }
     public virtual ICollection<Episode> Episodes { get; set; }
}

У меня проблема с EpisodeCount: 0.В настоящее время решение состоит в том, чтобы запустить .Include(x => x.Episodes) в моем EF-запросе, но он загружает всю коллекцию эпизодов там, где это не нужно.Это также увеличивает мое время HTTP-запроса, с 100 мс до 700 мс, что просто не хорошо.

Я не собираюсь жертвовать временем ради простых деталей, поэтому есть ли решение, в котором EF может запрашивать только COUNT эпизодов, не загружая всю коллекцию в?

Iбыло предложено сделать это

var animeList = context.Anime.ToPagedList(1, 20);
animeList.ForEach(x => x.EpisodeCount = x.Episodes.Count());
return Json(animeList);

, но в EpisodeCount это также возвращает 0, так что это нереальное решение.

1 Ответ

0 голосов
/ 22 мая 2018

Вам необходимо спроецировать нужные данные в специальный класс (он же ViewModel, DTO и т. Д.).К сожалению (или нет?), Чтобы избежать N + 1 запросов, проекция должна включать не только счет, но и все другие поля.

Например:

Модель:

public class Anime
{
    public int Id { get; set; }
    public string Name { get; set; }
    // other properties...
    public virtual ICollection<Episode> Episodes { get; set; }
}

ViewModel / DTO:

public class AnimeInfo
{
    public int Id { get; set; }
    public string Name { get; set; }
    // other properties...
    public int EpisodeCount { get; set; }
}

Тогда следующий код:

var animeList = db.Anime.Select(a => new AnimeInfo
{
    Id = a.Id,
    Name = a.Name,
    EpisodeCount = a.Episodes.Count()
})
.ToList();

создает следующий синглSQL-запрос:

SELECT [a].[Id], [a].[Name], (
     SELECT COUNT(*)
     FROM [Episode] AS [e]
     WHERE [a].[Id] = [e].[AnimeId]
) AS [EpisodeCount]
FROM [Anime] AS [a]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...