Уменьшить дублирование кода в switch с помощью select?

#asp.net-mvc-4 #switch-statement #redundancy

#asp.net-mvc-4 #switch-инструкция #избыточность

Вопрос:

У меня есть этот переключатель с помощью select

 switch (sorting)
            {
                case "newest":
                {
                        var userId = User.Identity.GetUserId();
                        var model = db.Posts.Include(p => p.Vote)
                            .OrderByDescending(p => p.PostId).ToList()
                            .Select(p => new ListPostsViewModel
                            {
                                UserVotedUpOnPost = p.Vote.Any(u => u.ApplicationUserID == userId amp;amp; u.PostVote == 1),
                                UserVotedDownOnPost = p.Vote.Any(u => u.ApplicationUserID == userId amp;amp; u.PostVote == -1),
                                PostId = p.PostId.ToString(),
                                TimeAgo = ToRelativeDate(p.MessageDate),
                                Message = p.Message,
                                TotalVotes = p.Vote.Sum(v => v.PostVote)
                            }).ToList();
                    return View("Index", model);

                } break;

                case "oldest":
                    {
                        var userId = User.Identity.GetUserId();
                        var model = db.Posts.Include(p => p.Vote)
                            .OrderBy(p => p.PostId).ToList()
                            .Select(p => new ListPostsViewModel
                            {
                                UserVotedUpOnPost = p.Vote.Any(u => u.ApplicationUserID == userId amp;amp; u.PostVote == 1),
                                UserVotedDownOnPost = p.Vote.Any(u => u.ApplicationUserID == userId amp;amp; u.PostVote == -1),
                                PostId = p.PostId.ToString(),
                                TimeAgo = ToRelativeDate(p.MessageDate),
                                Message = p.Message,
                                TotalVotes = p.Vote.Sum(v => v.PostVote)
                            }).ToList();
                        return View("Index", model);
                    }
                    break;
}
  

Как вы можете видеть, единственная строка, которая отличается, это .OrderByDescending(p => p.PostId).ToList() и у меня будет еще несколько похожих, но как я могу написать ее, не дублируя весь код в select и т.д.?

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

1. var data= db.Posts.Include(p => p.Vote); Затем ваши операторы switch упорядочивают его — case "newest": data = data.OrderBy(...) и т.д. И, наконец, var model = data.Select(....

Ответ №1:

Что-то вроде:

 var qry = db.Posts.Include(p => p.Vote);
select (sorting) {
  case "newest":
    qry = qry.OrderBy(x => x.Date);
    break;

  case "oldest":
    qry = qry.OrderByDescending(x => x.Date);
    break;
}
var res = qry.Select(p => new ListPostsViewModel {
                       …
                     });
 return View("Index, res);