using FrequentlyAskedQuestionsCodeFirst.Models; using FrequentlyAskedQuestionsCodeFirst.Models.FaqViewModels; using FrequentlyAskedQuestionsCodeFirst.Data; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Logging; using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Threading.Tasks; using Microsoft.EntityFrameworkCore; namespace FrequentlyAskedQuestionsCodeFirst.Controllers { public class HomeController : Controller { private readonly FaqContext _context; public HomeController(FaqContext context) { _context = context; } public async Task Index( int? id, string sortOrder, string currentFilter, string searchString, int? tagFilter, int? pageNumber) { ViewData["CurrentSort"] = sortOrder; if (searchString != null) { pageNumber = 1; } else { searchString = currentFilter; } ViewData["CurrentFilter"] = searchString; var viewModel = new QuestionIndexData(); if (!String.IsNullOrEmpty(searchString)) { viewModel.Questions = await _context.QuestionAndAnswers .Include(i => i.Votes) .Include(i => i.QuestionTags) .ThenInclude(i => i.Tags) .Where(s => s.Question.Contains(searchString) || s.Answer.Contains(searchString)) .AsNoTracking() .OrderByDescending(i => i.Votes.Count) .ToListAsync(); } else { viewModel.Questions = await _context.QuestionAndAnswers .Include(i => i.Votes) .Include(i => i.QuestionTags) .ThenInclude(i => i.Tags) .AsNoTracking() .OrderByDescending(i => i.Votes.Count) .ToListAsync(); } if (id != null) { ViewData["QuestionID"] = id.Value; QuestionAndAnswer question = viewModel.Questions.Where( i => i.ID == id.Value).Single(); Vote votes = viewModel.Votes.Where( i => i.ID == id.Value).Single(); viewModel.Tags = question.QuestionTags.Select(s => s.Tags); } else { viewModel.Tags = await _context.Tags .Include(i => i.QuestionTags) .AsNoTracking() .OrderByDescending(t => t.QuestionTags.Count) .ToListAsync(); } ViewData["TagFilter"] = tagFilter; if (tagFilter != null) { viewModel.Questions = await _context.QuestionAndAnswers .Include(i => i.Votes) .Include(b => b.QuestionTags) .ThenInclude(i => i.Tags) .Where(b => b.QuestionTags.Any(t => t.TagID == tagFilter)) .AsNoTracking() .OrderByDescending(i => i.Votes.Count) .ToListAsync(); } [ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)] public IActionResult Error() { return View(new ErrorViewModel { RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier }); } } }