private IEnumerable <AuditTrail> SortData(GetAuditTrailsRequest request, IDictionary <string, SortOrder> sortingDictionary, out int TotalRecords)
        {
            var data = DataContext.AuditTrails.Include(x => x.User).AsQueryable();

            if (!string.IsNullOrEmpty(request.Search) && !string.IsNullOrWhiteSpace(request.Search))
            {
                data = data.Where(x => x.TableName.Contains(request.Search) || x.Action.Contains(request.Search) || x.ActionName.Contains(request.Search) ||
                                  x.ControllerName.Contains(request.Search) || x.NewValue.Contains(request.Search) || x.OldValue.Contains(request.Search));
            }

            if (request.StartDate != null)
            {
                data = data.Where(x => DbFunctions.TruncateTime(x.UpdateDate) >= request.StartDate.Date);
            }

            if (request.EndDate != null)
            {
                data = data.Where(x => DbFunctions.TruncateTime(x.UpdateDate) <= request.EndDate.Date);
            }

            //data = data.GroupBy(x => x.RecordId).Select(y => y.OrderByDescending(x => x.UpdateDate).FirstOrDefault())
            //    .OrderByDescending(x => x.UpdateDate).Include(x => x.User);

            foreach (var sortOrder in sortingDictionary)
            {
                switch (sortOrder.Key)
                {
                case "User":
                    data = sortOrder.Value == SortOrder.Ascending
                            ? data.OrderByDescending(x => x.UpdateDate).ThenBy(x => x.User.Username)
                            : data.OrderByDescending(x => x.UpdateDate).ThenByDescending(x => x.User.Username);
                    break;

                case "TableName":
                    data = sortOrder.Value == SortOrder.Ascending
                            ? data.OrderByDescending(x => x.UpdateDate).ThenBy(x => x.TableName)
                            : data.OrderByDescending(x => x.UpdateDate).ThenByDescending(x => x.TableName);
                    break;

                case "Controller":
                    data = sortOrder.Value == SortOrder.Ascending
                            ? data.OrderByDescending(x => x.UpdateDate).ThenBy(x => x.ControllerName)
                            : data.OrderByDescending(x => x.UpdateDate).ThenByDescending(x => x.ControllerName);
                    break;

                default:
                    data = data.OrderByDescending(x => x.UpdateDate);
                    break;
                }
            }
            TotalRecords = data.Count();
            return(data);
        }
        public AuditTrailsResponse GetAuditTrails(GetAuditTrailsRequest request)
        {
            int totalRecords;
            var data = SortData(request, request.SortingDictionary, out totalRecords);

            if (request.Take != -1)
            {
                data = data.Skip(request.Skip).Take(request.Take);
            }

            return(new AuditTrailsResponse
            {
                TotalRecords = totalRecords,
                AuditTrails = data.ToList().MapTo <AuditTrailsResponse.AuditTrail>()
            });
        }