Считать сообщения по тегам даже для тегов, которые не имеют сообщений - PullRequest
1 голос
/ 04 апреля 2019

В Entity Framework Core у меня есть 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.

Как я могу это сделать?

1 Ответ

2 голосов
/ 04 апреля 2019

Проблема, как я вижу, в том, что вы начинаете с PostTags, и, вероятно, в этом случае нет записей в PostTags;Похоже, вы хотите начать с Tags, затем с левой стороны до Posts.На самом деле: если у вас есть ссылочная целостность, вам даже не нужно переходить на Posts - PostTags должно быть достаточно.Так что ... возможно просто:

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

(извините, если LINQ не работает - лично я просто написал бы его как SQL, так что я точно знаю , какой SQL выполняется)

...