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,
            });
        }