public JsonResult Read([DataSourceRequest] DataSourceRequest request) { try { System.Collections.Generic.List <NewEntryList> GetDetails = DB.Database.SqlQuery <NewEntryList>( @"exec " + Constants.P_GetEmpTimesheet_NewEntry_Test + " @EmpID,@IsNewEntry", new object[] { new SqlParameter("@EmpID", (long)Session[Constants.SessionEmpID]), new SqlParameter("@IsNewEntry", false) }).ToList(); GetDetails = GetDetails.OrderByDescending(x => x.CreatedOn).ToList(); var res = (from x in GetDetails group x by x.SequenceNo into g select new { g.Key, List = g.ToList() }).ToList(); GetDetails = new List <NewEntryList>(); foreach (var item in res) { GetDetails.Add(item.List.FirstOrDefault()); } for (int i = 1; i <= GetDetails.Count; i++) { GetDetails[i - 1].ItemNo = i; } return(Json(GetDetails.ToDataSourceResult(request))); } catch (Exception ex) { LogHelper.ErrorLog(ex); throw ex; } }
/// <summary> /// Retrieve all Buggs matching the search criteria. /// </summary> /// <param name="FormData">The incoming form of search criteria from the client.</param> /// <returns>A view to display the filtered Buggs.</returns> private BuggsViewModel GetResults(FormHelper FormData) { // Right now we take a Result IQueryable starting with ListAll() Buggs then we widdle away the result set by tacking on // Linq queries. Essentially it's Results.ListAll().Where().Where().Where().Where().Where().Where() // Could possibly create more optimized queries when we know exactly what we're querying // The downside is that if we add more parameters each query may need to be updated.... Or we just add new case statements // The other downside is that there's less code reuse, but that may be worth it. var fromDate = FormData.DateFrom; var toDate = FormData.DateTo.AddDays(1); IQueryable <Crash> results = null; IQueryable <Bugg> buggResults = null; var skip = (FormData.Page - 1) * FormData.PageSize; var take = FormData.PageSize; var sortedResultsList = new System.Collections.Generic.List <Bugg>(); var groupCounts = new System.Collections.Generic.SortedDictionary <string, int>(); int totalCountedRecords = 0; using (var unitOfWork = new UnitOfWork(new CrashReportEntities())) { var userGroupId = unitOfWork.UserGroupRepository.First(data => data.Name == FormData.UserGroup).Id; // Get every Bugg. var resultsAll = unitOfWork.CrashRepository.ListAll(); // Look at all Buggs that are still 'open' i.e. the last Crash occurred in our date range. results = FilterByDate(resultsAll, FormData.DateFrom, FormData.DateTo); // Filter results by build version. if (!string.IsNullOrEmpty(FormData.VersionName)) { results = results.Where(data => data.BuildVersion == FormData.VersionName); } // Filter by BranchName if (!string.IsNullOrEmpty(FormData.BranchName)) { results = results.Where(da => da.Branch.Equals(FormData.BranchName)); } // Filter by PlatformName if (!string.IsNullOrEmpty(FormData.PlatformName)) { results = results.Where(da => da.PlatformName.Equals(FormData.PlatformName)); } // Run at the end if (!string.IsNullOrEmpty(FormData.SearchQuery)) { try { var queryString = HttpUtility.HtmlDecode(FormData.SearchQuery.ToString()) ?? ""; // Take out terms starting with a - var terms = queryString.Split("-, ;+".ToCharArray(), StringSplitOptions.RemoveEmptyEntries); var allFuncionCallIds = new HashSet <int>(); foreach (var term in terms) { var functionCallIds = unitOfWork.FunctionRepository.Get(functionCallInstance => functionCallInstance.Call.Contains(term)).Select(x => x.Id).ToList(); foreach (var id in functionCallIds) { allFuncionCallIds.Add(id); } } // Search for all function ids. OR operation, not very efficient, but for searching for one function should be ok. results = allFuncionCallIds.Aggregate(results, (current, id) => current.Where(x => x.Pattern.Contains(id + "+") || x.Pattern.Contains("+" + id))); } catch (Exception ex) { Debug.WriteLine("Exception in Search: " + ex.ToString()); } } // Filter by Crash Type if (FormData.CrashType != "All") { switch (FormData.CrashType) { case "Crash": results = results.Where(buggInstance => buggInstance.CrashType == 1); break; case "Assert": results = results.Where(buggInstance => buggInstance.CrashType == 2); break; case "Ensure": results = results.Where(buggInstance => buggInstance.CrashType == 3); break; case "GPUCrash": results = results.Where(buggInstance => buggInstance.CrashType == 4); break; case "CrashAsserts": results = results.Where(buggInstance => buggInstance.CrashType == 1 || buggInstance.CrashType == 2 || buggInstance.CrashType == 4); break; } } // Filter by user group if present if (!string.IsNullOrEmpty(FormData.UserGroup)) { results = FilterByUserGroup(results, userGroupId); } if (!string.IsNullOrEmpty(FormData.JiraId)) { results = results.Where(data => data.Jira == FormData.JiraId); } var CrashByUserGroupCounts = unitOfWork.CrashRepository.ListAll().Where(data => data.User.UserGroupId == userGroupId && data.TimeOfCrash >= fromDate && data.TimeOfCrash <= toDate && data.BuggId != null) .GroupBy(data => data.BuggId) .Select(data => new { data.Key, Count = data.Count() }) .OrderByDescending(data => data.Count) .ToDictionary(data => data.Key, data => data.Count); var CrashInTimeFrameCounts = unitOfWork.CrashRepository.ListAll().Where(data => data.TimeOfCrash >= fromDate && data.TimeOfCrash <= toDate && data.BuggId != null) .GroupBy(data => data.BuggId) .Select(data => new { data.Key, Count = data.Count() }) .OrderByDescending(data => data.Count) .ToDictionary(data => data.Key, data => data.Count); var affectedUsers = unitOfWork.CrashRepository.ListAll().Where(data => data.User.UserGroupId == userGroupId && data.TimeOfCrash >= fromDate && data.TimeOfCrash <= toDate && data.BuggId != null) .Select(data => new { BuggId = data.BuggId, ComputerName = data.ComputerName }) .Distinct() .GroupBy(data => data.BuggId) .Select(data => new { data.Key, Count = data.Count() }) .OrderByDescending(data => data.Count) .ToDictionary(data => data.Key, data => data.Count); var ids = results.Where(data => data.BuggId != null).Select(data => data.BuggId).Distinct().ToList(); buggResults = unitOfWork.BuggRepository.ListAll().Where(data => ids.Contains(data.Id)); //buggResults = results.Where(data => data.BuggId != null).Select(data => data.Bugg).Distinct(); // Grab just the results we want to display on this page totalCountedRecords = buggResults.Count(); buggResults = GetSortedResults(buggResults, FormData.SortTerm, FormData.SortTerm == "descending", FormData.DateFrom, FormData.DateTo, FormData.UserGroup); sortedResultsList = buggResults.ToList(); // Get UserGroup ResultCounts var groups = buggResults.SelectMany(data => data.UserGroups) .GroupBy(data => data.Name) .Select(data => new { Key = data.Key, Count = data.Count() }) .ToDictionary(x => x.Key, y => y.Count); groupCounts = new SortedDictionary <string, int>(groups); foreach (var bugg in sortedResultsList) { if (CrashByUserGroupCounts.ContainsKey(bugg.Id)) { bugg.CrashesInTimeFrameGroup = CrashByUserGroupCounts[bugg.Id]; } else { bugg.CrashesInTimeFrameGroup = 0; } if (CrashInTimeFrameCounts.ContainsKey(bugg.Id)) { bugg.CrashesInTimeFrameAll = CrashInTimeFrameCounts[bugg.Id]; } else { bugg.CrashesInTimeFrameAll = 0; } if (affectedUsers.ContainsKey(bugg.Id)) { bugg.NumberOfUniqueMachines = affectedUsers[bugg.Id]; } else { bugg.NumberOfUniqueMachines = 0; } } sortedResultsList = sortedResultsList.OrderByDescending(data => data.CrashesInTimeFrameGroup).Skip(skip) .Take(totalCountedRecords >= skip + take ? take : totalCountedRecords).ToList(); foreach (var bugg in sortedResultsList) { var Crash = unitOfWork.CrashRepository.First(data => data.BuggId == bugg.Id); bugg.FunctionCalls = Crash.GetCallStack().GetFunctionCalls(); } } System.Collections.Generic.List <SelectListItem> branchNames; System.Collections.Generic.List <SelectListItem> versionNames; System.Collections.Generic.List <SelectListItem> platformNames; using (var unitOfWork = new UnitOfWork(new CrashReportEntities())) { branchNames = unitOfWork.CrashRepository.GetBranchesAsListItems(); versionNames = unitOfWork.CrashRepository.GetVersionsAsListItems(); platformNames = unitOfWork.CrashRepository.GetPlatformsAsListItems(); } return(new BuggsViewModel() { Results = sortedResultsList, PagingInfo = new PagingInfo { CurrentPage = FormData.Page, PageSize = FormData.PageSize, TotalResults = totalCountedRecords }, SortTerm = FormData.SortTerm, SortOrder = FormData.SortOrder, UserGroup = FormData.UserGroup, CrashType = FormData.CrashType, SearchQuery = FormData.SearchQuery, BranchNames = branchNames, VersionNames = versionNames, PlatformNames = platformNames, DateFrom = (long)(FormData.DateFrom - CrashesViewModel.Epoch).TotalMilliseconds, DateTo = (long)(FormData.DateTo - CrashesViewModel.Epoch).TotalMilliseconds, VersionName = FormData.VersionName, PlatformName = FormData.PlatformName, BranchName = FormData.BranchName, GroupCounts = groupCounts, Jira = FormData.JiraId, }); }