gpt4 book ai didi

c# - 如何在不包含/加载整个集合的情况下获取 Entity Framework 模型中列表的计数?

转载 作者:行者123 更新时间:2023-11-30 21:34:14 26 4
gpt4 key购买 nike

我在 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; }
}

View 模型/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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com