public void UpdateCacheItemViewModel() { bool IsItemCacheInProcess = false; _cache.TryGetValue("IsItemCacheInProcess", out IsItemCacheInProcess); if (!IsItemCacheInProcess) { _cache.Set("IsItemCacheInProcess", true); //update cache Config config = ConfigJSON.Read(); //split data to 1lakh and save to cache int count = 1000, skip = 0, errorCount = 0; DateTime startDate = DateTime.Now; //_context.ChangeTracker.AutoDetectChangesEnabled = false; for (; ;) { try { IList <ItemViewModel> itemsTotal = new List <ItemViewModel>(); _cache.TryGetValue("ItemViewModel", out itemsTotal); if (itemsTotal == null) { _cache.Set("IsItemCacheInProcess", false); break; } _context.Database.SetCommandTimeout(TimeSpan.FromHours(1)); var listOfItemsChanged = _context.ItemUpdateTrigger.Skip(skip).Take(count).ToList(); var listOfItemsCodeToLoad = listOfItemsChanged.Where(x => x.ACTIONS != "Delete") .Select(x => x.ITEMCODE).Distinct().ToList(); var listOfItemsChangedCode = listOfItemsChanged.Select(x => x.ITEMCODE).Distinct().ToList(); foreach (var i in listOfItemsChangedCode) { var listOfItemsToDelete = itemsTotal.Where(x => x.Code == i).ToList(); foreach (var j in listOfItemsToDelete) { itemsTotal.Remove(j); } } string listOfItemsCodeString = string.Join(",", listOfItemsCodeToLoad); IList <ItemViewModel> itemsTemp = _context.ItemViewModel.FromSql("SPItemViewModel {0}", listOfItemsCodeString).ToList(); if (itemsTemp.Count() > 0) { itemsTotal = itemsTotal.Concat(itemsTemp).ToList(); _cache.Set("ItemViewModel", itemsTotal); //now remove trigger from database _context.RemoveRange(listOfItemsChanged); _context.SaveChanges(); double totalTimeTake = (DateTime.Now - startDate).TotalMinutes; config.Environment = "Total Time take " + totalTimeTake + " Mins"; ConfigJSON.Write(config); _cache.Set("IsItemCacheInProcess", false); break; } else { _cache.Set("IsItemCacheInProcess", false); break; } } catch (Exception ex) { if (errorCount > 5) { _cache.Set("IsItemCacheInProcess", false); break; } errorCount += 1; } } } }