Try what's below on for size. The date calculation is moved out of the loop, the `TeamSales` list capacity is pre-allocated and finally, the two LINQ statements are combined into one and rolled into `AddRange` rather than the explicit loop. public static int GetNationalRank(int teamId, int CurrentUserId) { int currentUserRank; var startDate = Convert.ToDateTime(DateTime.Now.AddDays(-(DateTime.Now.Day - 1)).ToString("M/d/yyyy")); var endDate = Convert.ToDateTime(DateTime.Now.AddDays(1).ToString("M/d/yyyy")); List<ProPit_User> proPitUsers; using (var ppdb = new ProsPitEntities()) { proPitUsers = ppdb.ProPit_User.Where(x => x.SalesRepID != null).ToList(); } var teamSales = new List<TeamSales>(proPitUsers.Count()); using (var db = new TraegerEntities()) { teamSales.AddRange(proPitUsers .Select(user => new { user, total = db.Orders.Where(o => o.DateCompleted >= startDate && o.DateCompleted < endDate && (o.Status == 1 || o.Status == 2) && o.Kiosk != 0 && o.SalesRepID == user.SalesRepID).Select(o => (decimal?)o.OrderTotal).Sum() ?? 00.0M }) .Select(userTotal => new TeamSales { userId = userTotal.user.userID, TotalSales = userTotal.total })); var rank = teamSales .OrderByDescending(x => x.TotalSales) .FindIndex(x => x.userId == CurrentUserId); currentUserRank = rank == -1 ? 0 : rank + 1; } return currentUserRank; }