public async Task<ActionResult> GameList()
        {
            var viewModel = new DateFilteredListViewModel<GameListRowViewModel>
            {
                Items = await db.Games
                .Select(
                    g =>
                        new GameListRowViewModel
                        {
                            Game = g,
                            QuantitySold = db.WebOrders
                                .SelectMany(
                                    wo => wo.OrderItems
                                        .Where(oi => g.GameSKUs.Contains(oi.Product)))
                                .Select(oi => oi.Quantity)
                                .DefaultIfEmpty(0).Sum()
                        }
                ).OrderByDescending(g => g.QuantitySold).ToListAsync()
            };

            return View(viewModel);
        }
        public async Task<ActionResult> GameList(DateTime start, DateTime? end)
        {
            end = SetToEndOfDayIfInPast(end);

            var viewModel = new DateFilteredListViewModel<GameListRowViewModel>
            {
                StartDate = start,
                EndDate = end,
                Items = await db.Games
                    .Select(
                        g =>
                            new GameListRowViewModel
                            {
                                Game = g,
                                QuantitySold = db.WebOrders
                                    .Where(o => o.OrderDate >= start && o.OrderDate <= end)
                                    .SelectMany(
                                        wo => wo.OrderItems
                                            .Where(oi => g.GameSKUs.Contains(oi.Product)))
                                    .Select(oi => oi.Quantity)
                                    .DefaultIfEmpty(0).Sum()
                            }
                    ).OrderByDescending(g => g.QuantitySold).ToListAsync()
            };

            return View(viewModel);
        }
        public async Task<ActionResult> MemberList(DateTime start, DateTime? optionalEnd)
        {
            DateTime end = SetToEndOfDayIfInPast(optionalEnd);

            var viewModel = new DateFilteredListViewModel<MemberListItemViewModel>
            {
                StartDate = start,
                EndDate = end,
                Items = await db.Users.
                    Where(u => u.Member != null).
                    Select(
                        u =>
                            new MemberListItemViewModel
                            {
                                UserName = u.UserName,
                                FullName = u.FirstName + " " + u.LastName,
                                OrderCount =
                                    db.WebOrders.Count(
                                        wo =>
                                            wo.MemberId == u.Id && wo.OrderDate >= start && wo.OrderDate <= end),
                                TotalSpentOnOrders = db.WebOrders.
                            Where(wo => wo.MemberId == u.Id && wo.OrderDate >= start && wo.OrderDate <= end).
                            Select(wo => wo.OrderSubtotal + wo.ShippingCost + wo.TaxAmount).
                            DefaultIfEmpty(0).
                            Sum(),
                                AverageOrderTotal = db.WebOrders.
                            Where(wo => wo.MemberId == u.Id && wo.OrderDate >= start && wo.OrderDate <= end).
                            Select(wo => wo.OrderSubtotal + wo.ShippingCost + wo.TaxAmount).
                            DefaultIfEmpty(0).
                            Average()
                            }
                    ).
                    OrderByDescending(mli => mli.TotalSpentOnOrders).
                    ThenByDescending(mli => mli.AverageOrderTotal).
                    ThenByDescending(mli => mli.OrderCount).
                    ToListAsync()
            };

            return View(viewModel);
        }
        public async Task<ActionResult> MemberList()
        {
            var viewModel = new DateFilteredListViewModel<MemberListItemViewModel>
            {
                Items = await db.Users.
                    Where(u => u.Member != null).
                    Select(u =>
                        new MemberListItemViewModel
                        {
                            UserName = u.UserName,
                            FullName = u.FirstName + " " + u.LastName,
                            OrderCount = db.WebOrders.Count(wo => wo.MemberId == u.Id),
                            TotalSpentOnOrders = db.WebOrders.
                                Where(wo => wo.MemberId == u.Id).
                                Select(wo => wo.OrderSubtotal + wo.ShippingCost + wo.TaxAmount).
                                DefaultIfEmpty(0).
                                Sum(),
                            AverageOrderTotal = db.WebOrders.
                                Where(wo => wo.MemberId == u.Id).
                                Select(wo => wo.OrderSubtotal + wo.ShippingCost + wo.TaxAmount).
                                DefaultIfEmpty(0).
                                Average()
                        }
                    ).
                    OrderByDescending(mli => mli.TotalSpentOnOrders).
                    ThenByDescending(mli => mli.AverageOrderTotal).
                    ToListAsync()
            };

            return View(viewModel);
        }