Подсчитывать записи по тегам даже для тегов, в которых нет записей

#c# #entity-framework-core #linq-to-entities

#c# #entity-framework-core #linq-to-entities

Вопрос:

В ядре 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; } 
}
  

Мне нужно получить количество записей для каждого тега, поэтому я попытался:

 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. Это сработало. Если вы добавите свой код в качестве ответа, я могу пометить его как ответ.

Ответ №1:

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

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

(извините, если LINQ устарел — лично я бы просто написал это как SQL, чтобы точно знать, какой SQL выполняется)