// GET: Session/Topic public ActionResult Index(FilteredTopics filter, string viewPref) { ActiveSession session = GetSession(); if (session == null) return RedirectToAction("Index", "Master"); if (viewPref == "Table" || viewPref == "Panels") Session["DiscussionView"] = viewPref; PrepareTopics(filter, session); if ((Session["DiscussionView"] as string) == "Table") return View("IndexTable", filter); else return View("IndexPanels", filter); // Default }
private void PrepareTopics(FilteredTopics filter, ActiveSession session) { // Zwecks Performance wäre hier eigentlich eine Query-Projektion angebracht IQueryable<Topic> query = db.Topics .Include(t => t.SessionType) .Include(t => t.TargetSessionType) .Include(t => t.Owner) .Include(t => t.Comments) .Include(t => t.Lock) .Include(t => t.Tags) .Include(t => t.Votes) .Include(t => t.UnreadBy) .Include(t => t.Assignments) .Where(t => t.Decision == null && !t.IsReadOnly) .Where(t => t.Lock.Session.ID == session.ID || (t.SessionTypeID == session.SessionType.ID && t.Created < session.Start && !(t.ResubmissionDate >= session.Start))); if (filter.ShowPriority >= 0) query = query.Where(t => t.Priority == (Priority)filter.ShowPriority); if (filter.Timespan != 0) { if (filter.Timespan > 0) // Nur die letzten x Tage anzeigen { var cutoff = DateTime.Today.AddDays(-filter.Timespan); query = query.Where(t => t.Created >= cutoff); } else // Alles VOR den letzten x Tagen anzeigen { var cutoff = DateTime.Today.AddDays(filter.Timespan); query = query.Where(t => t.Created < cutoff); } } if (filter.OwnerID != 0) query = query.Where(a => a.OwnerID == filter.OwnerID); filter.UserList = CreateUserSelectList(); filter.PriorityList = TopicsController.PriorityChoices(filter.ShowPriority); filter.SessionTypeList = new SelectList(db.GetActiveSessionTypes(), "ID", "Name"); filter.TimespanList = TopicsController.TimespanChoices(filter.Timespan); using (MiniProfiler.Current.Step("Sortierung der Themen")) { filter.Topics = query.ToList().OrderByDescending(t => t.IsUnreadBy(GetCurrentUserID())).ThenBy(t => { TimeSpan time; return TimeSpan.TryParse(t.Time, out time) ? time : new TimeSpan(24, 0, 0); }).ThenByDescending(t => t.Priority).ThenBy(t => t.Created).ToList(); } foreach (var topic in filter.Topics) topic.IsLocked = topic.Lock != null; }
// GET: Topics /// <summary> /// Liefert eine tabellarische Auflistung der Themen. Der Benutzer kann nun die Themen filtern, oder auf die Detailseite /// wechseln. Das ViewModel <see cref="FilteredTopics" /> wird verwndet, um die Filterkriteriem zu transportieren. /// </summary> /// <param name="filter">Das ViewModel, dass die Filterkriterien angibt.</param> public ActionResult Index(FilteredTopics filter) { IQueryable<Topic> query = db.Topics .Include(t => t.SessionType) .Include(t => t.TargetSessionType) .Include(t => t.Creator); if (!filter.ShowReadonly) query = query.Where(t => !t.IsReadOnly); if (filter.ShowPriority >= 0) query = query.Where(t => t.Priority == (Priority)filter.ShowPriority); if (filter.SessionTypeID > 0) query = query.Where(t => t.SessionTypeID == filter.SessionTypeID || t.TargetSessionTypeID == filter.SessionTypeID); if (filter.Timespan != 0) { if (filter.Timespan > 0) // Nur die letzten x Tage anzeigen { var cutoff = DateTime.Today.AddDays(-filter.Timespan); query = query.Where(t => t.Created >= cutoff); } else // Alles VOR den letzten x Tagen anzeigen { var cutoff = DateTime.Today.AddDays(filter.Timespan); query = query.Where(t => t.Created < cutoff); } } if (filter.OwnerID != 0) query = query.Where(a => a.OwnerID == filter.OwnerID); if (filter.ShowTagsID.Count > 0) { var desired = filter.ShowTagsID.ToArray(); query = query.Where(topic => topic.Tags.Any(tt => desired.Contains(tt.TagID))); } filter.UserList = CreateUserSelectList(); filter.PriorityList = PriorityChoices(filter.ShowPriority); filter.SessionTypeList = new SelectList(db.GetActiveSessionTypes(), "ID", "Name"); filter.TimespanList = TimespanChoices(filter.Timespan); filter.TagList = db.Tags.Select(tag => new SelectListItem { Text = tag.Name, // ReSharper disable once SpecifyACultureInStringConversionExplicitly Value = tag.ID.ToString() }).ToList(); filter.Topics = query.OrderByDescending(t => t.Priority).ThenBy(t => t.Title).ToList(); return View(filter); }