#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 выполняется)