即使对于没有帖子的标签,也可以按标签计算帖子
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 是什么执行)
在 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 是什么执行)