Запрашивать много-много отношений - PullRequest
0 голосов
/ 07 сентября 2018

Я видел пост об отношениях в официальной основной документации asp.net: Отношения базовой модели asp.net

public class Post
{
    public int PostId { get; set; }
    public string Title { get; set; }
    public string Content { get; set; }

    public List<PostTag> PostTags { get; set; }
}

public class Tag
{
    public string TagId { get; set; }

    public List<PostTag> PostTags { get; set; }
}

public class PostTag
{
    public int PostId { get; set; }
    public Post Post { get; set; }

    public string TagId { get; set; }
    public Tag Tag { get; set; }
}

Если бы я хотел вернуть список всех тегов, я бы сделал это:

public async Task<IEnumerable<Tag>> AllTags()
{
return await _context.Tags
.Include(q => q.PostTags).ThenInclude(q => q.Post);
}

Как я могу вернуть теги и количество сообщений, к которым они применены?

Пример =

Бюджет (3)

1 Ответ

0 голосов
/ 07 сентября 2018

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

public class PostCount
{
    public string Name { get; set; }
    public int Count { get; set; }
}

Теперь в вашем методе действия вы можете запросить коллекцию Tags и вызвать метод Count для свойства PostTags каждого объекта Tag. В своем выражении LINQ вы можете создать проекцию для создания объекта модели представления.

public async Task<IEnumerable<PostCount>> AllTags()
{
    var tags = await _context.Tags
                             .Select(a => new PostCount
                                          {
                                             Name = a.Name,
                                             Count = a.PostTags.Count()
                                          }
                                    ).ToListAsync();

    return tags;
}

Приведенный выше вернет нужные вам данные при доступе к этому методу действия.

Если вы показываете это в представлении, вы можете вернуть созданный нами список вашему представлению. по вашему мнению, который строго типизирован для списка класса PostCount, вы можете отобразить имя тега и его количество сообщений

public async Task<IEnumerable<PostCount>> AllTags()
{
    var tags = await _context.Tags.Select(a => new PostCount
    {
        Name = a.Name,
        Count = a.PostTags.Count()
    }).ToListAsync();

    return View(tags);
}

а в вашем AllTags.cshtml представлении

@model List<PostCount>
<h3>Tags</h3>
@foreach(var tag in Model)
{
  <p>@tag.Name  @tag.Count </p>
}

Также вам, вероятно, необходимо иметь свойство первичного ключа в вашем PostTag классе

public class PostTag
{
   public int Id  { set;get; }
   // other properties you have
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...