private IQueryable<Ticket> ApplyFilter(TicketFilter filter)
        {
            var filteredTicketsList = this.Data.Tickets.All();

            if (filter.Title != null)
            {
                filteredTicketsList = filteredTicketsList.Where(t => t.Title == filter.Title);
            }

            if (filter.CategoryId != null)
            {
                filteredTicketsList = filteredTicketsList.Where(t => t.CategoryId == filter.CategoryId);
            }

            if (filter.AuthorId != null)
            {
                filteredTicketsList = filteredTicketsList.Where(t => t.AuthorId == filter.AuthorId);
            }

            if (filter.Priority != null)
            {
                filteredTicketsList = filteredTicketsList.Where(t => t.Priority == filter.Priority);
            }

            if (filter.Status != null)
            {
                filteredTicketsList = filteredTicketsList.Where(t => t.Status == filter.Status);
            }

            return filteredTicketsList;
        }
        public ActionResult Index(TicketFilter filter, int? page)
        {
            var pageIndex = page.GetValueOrDefault(1);
            var filteredTicketsList = this.ApplyFilter(filter)
                                          .AsEnumerable()
                                          .Select(t => new TicketSummaryViewModel
                                                 {
                                                     Id = t.Id,
                                                     Title = t.Title,
                                                     CategoryName = t.Category.Name,
                                                     AuthorName = t.Author.UserName,
                                                     Priority = t.Priority,
                                                     Status = t.Status,
                                                     SearchRelevance = Helpers.Filter.CalcualteFilterTicketRelevance(t, filter.Q)
                                                 })
                                          .Where(t => t.SearchRelevance > 0 && t.Status != TicketStatus.Closed && t.Status != TicketStatus.Duplicate)
                                          .OrderByDescending(t => t.SearchRelevance)
                                          .ThenByDescending(t => t.Id);

            var pagedTicketsList = filteredTicketsList
                                                      .Skip((pageIndex - 1) * Properties.Settings.Default.TicketsPageSize)
                                                      .Take(Properties.Settings.Default.TicketsPageSize);

            var pagesCount = (int)Math.Ceiling((double)filteredTicketsList.Count() / Properties.Settings.Default.TicketsPageSize);
            var categoriesList = this.GetFilterList(t => new SelectListItem { Value = t.CategoryId.ToString(), Text = t.Category.Name });
            var prioritiesList = this.GetFilterList(t => new SelectListItem { Value = t.Priority.ToString(), Text = t.Priority.ToString() });
            var statusesList = this.GetFilterList(t => new SelectListItem { Value = t.Status.ToString(), Text = t.Status.ToString() });
            var authorsList = this.GetFilterList(t => new SelectListItem { Value = t.AuthorId.ToString(), Text = t.Author.UserName.ToString() });
            var titlesList = this.GetFilterList(t => new SelectListItem { Value = t.Title.ToString(), Text = t.Title.ToString() });

            var viewModel = new TicketsFilterableViewModel
            {
                TicketsList = pagedTicketsList,
                Filter = filter,
                PagesCount = pagesCount,
                TotalRecordsCount = filteredTicketsList.Count(),
                MetaData = new TicketsMetaDataViewModel
                {
                    CategoriesList = categoriesList,
                    PrioritiesList = prioritiesList,
                    StatusesList = statusesList,
                    AuthorsList = authorsList,
                    TitlesList = titlesList
                }
            };

            return View(viewModel);
        }