在实体框架核心中,我有 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; }
}
我需要获取每个标签的帖子计数,所以我尝试了:
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
开始,然后从左到外到Posts
。实际上:假设你有参照完整性,你甚至不需要去Posts
——PostTags
应该就足够了。所以。。。也许只是:
await context.Tags.AsNoTracking().Select(x => {
x.TagId, PostCount = x.PostTags.Count() }).ToListAsync();
(对不起,如果 LINQ 生锈了 - - 我个人只会把它写成 SQL,所以我确切地知道正在执行什么 SQL(