Отображать внешний ключ один раз в представлении?

#asp.net-mvc #asp.net-mvc-4 #razor

#asp.net-mvc #asp.net-mvc-4 #бритва

Вопрос:

У меня есть две модели, сообщения и комментарии. Post PK — это внешний ключ в комментариях (один ко многим). Тогда у меня есть ViewModel с сообщениями и комментариями.

Это мой контроллер

 public ActionResult Index()
{
    var model = db.Comments.Include(p => p.Post)
        .OrderByDescending(p => p.CommentId).ToList()
        .Select(p => new ListCommentsViewModel
        {
            Comment = p.PostComment,
            Message = p.Post.Message
        }).ToList();

    return View(model);
}
  

Позже я буду фильтровать значение внешнего ключа, поэтому значение внешнего ключа всегда будет одинаковым. Как я могу отобразить его один раз в представлении. Это работает

 @model IEnumerable<FreePost.Viewmodels.ListCommentsViewModel>
@foreach (var item in Model)
            {
                @Html.DisplayFor(modelItem => item.Message)
                @Html.DisplayFor(modelItem => item.Comment)
            }
  

Но я хочу использовать @Html.DisplayFor(modelItem => item.Message) внешний foreach смысл, значение сообщения внешнего ключа всегда будет одинаковым.

Обновить

Это сообщения и комментарии моих моделей

  public class Post
    {
        public Post()
        {
            Vote = new HashSet<Vote>();
            Comment = new HashSet<Comment>();
        }

        public int PostId { get; set; }
        public string Message { get; set; }
        public DateTime MessageDate { get; set; }

        public virtual ApplicationUser User { get; set; }
        public virtual ICollection<Vote> Vote { get; set; }

        public ICollection<Comment> Comment { get; set; }
    }

    public class Comment
    {
        public Comment() { }

        public int CommentId { get; set; }
        public string PostComment { get; set; }
        public DateTime CommentDate { get; set; }

        public int PostRefId { get; set; }

        [ForeignKey("PostRefId")]
        public virtual Post Post { get; set; }
    }
  

Обновление 2

С моим кодом я получаю этот результат в представлении

 post 1
Comment 1
post 1
Comment 2
post 1
Comment 3
  

Я хочу получить этот результат (смысл сообщения тот же FK)

 post 1
Comment 1
Comment 2
Comment 3
  

Комментарии:

1. Что такое имя поля post table pk?

2. PK в сообщениях — postID -> public int postID { получить; установить; }

Ответ №1:

Попробуйте присоединиться в запросе linq

 var model = (from p in db.Post
            join c in db.Comments on p.PostId equals c.PostId
            select new { p.Post, c.PostComment})
            .OrderByDescending(p => p.CommentId);
  

На странице просмотра

 @model IEnumerable<FreePost.Viewmodels.ListCommentsViewModel>
string post="";
@foreach (var item in Model)
{
   if(post!=item.Post)
   {
   @Html.DisplayFor(modelItem => item.Post)
   }
   @Html.DisplayFor(modelItem => item.PostComment)
   post=item.Post;
}
  

или

  var model = (from p in db.Post
            join c in db.Comments on p.PostId equals c.PostId into g
            select new { p.Post, 
            comments = g.Select(x =>x.PostComment)}).AsEnumerable()
            .Select(x => new {x.Post,comments = String.Join(",",x.PostComment)})
            .OrderByDescending(p => p.CommentId);
  

На странице просмотра

  @model IEnumerable<FreePost.Viewmodels.ListCommentsViewModel>

    @foreach (var item in Model)
    {
       @Html.DisplayFor(modelItem => item.Post)
       @Html.DisplayFor(modelItem => item.comments ) //All comments display in single line with splited by ",".If you want different line using split function to split the string

    }
  

Комментарии:

1. При этом сообщение «@Html.DisplayFor (ModelItem => item.Post)» будет отображаться в представлении только один раз? Я вижу, что у вас все еще есть элемент. Опубликовать в начале.