我在Entity Framework Core中有一个模型,如下所示:

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


我遇到了EpisodeCount是0的问题。当前的解决方案是在我的EF查询中运行.Include(x => x.Episodes),但这会在不需要的地方加载整个情节集合。这也将我的HTTP请求时间从100毫秒增加到700毫秒,这不是很好。

我不愿意为简单的细节而牺牲时间,那么有没有一种解决方案,我可以让EF仅查询剧集的COUNT个,而无需加载整个收藏集?

建议我这样做

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


但这也会在EpisodeCount中返回0,因此这不是可行的解决方案。

最佳答案

您需要将所需的数据投影到一个特殊的类(也就是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]

关于c# - 如何在不包含/加载整个集合的情况下获得Entity Framework模型中列表的计数?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50471436/

10-13 07:38