即使对于没有帖子的标签,也可以按标签计算帖子

Count posts by tags even for tags that have not posts

在 Entity Framework 核心中我有 3 个实体:

public class Post { 
  public Int32 PostId { get; set; }
  public virtual ICollection<PostTag> PostTags { get; set; } 
}

public class PostTag { 
  public Int32 PostId { get; set; } 
  public Int32 TagId { get; set; } 
  public virtual Post { get; set; }
  public virtual Tag { get; set; }
}

public class Tag { 
  public Int32 TagId { get; set; }
  public virtual ICollection<PostTag> PostTags { get; set; } 
}

我需要获取每个标签的 Post 计数,所以我尝试了:

IQueryable<PostTag> postTags = context.PostTags.AsNoTracking();

var stats = await postTags
  .GroupBy(x => x.Tag)
  .Select(x => new {
    TagId = x.Key.Id,
    TagName = x.Key.Name
    PostCount = x.Count()
  }).ToListAsync();

问题是没有帖子的标签不会出现...

而且我希望它们以 PostCount = 0 出现。

我该怎么做?

我看到的问题是您是从 PostTags 开始的,在这种情况下,大概 PostTags 中没有任何记录;看起来您想从 Tags 开始,然后是 left-outer 一直到 Posts。实际上:假设您具有参照完整性,您甚至不需要到达 Posts - PostTags 就足够了。所以...也许只是:

await context.Tags.AsNoTracking().Select(x => {
   x.TagId, PostCount = x.PostTags.Count() }).ToListAsync();

(抱歉,如果 LINQ 生锈了 - - 我个人只是将其写为 SQL,所以我 确切地 知道 SQL 是什么执行)