#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);