Система застревает при фильтрации по DateTime в .Net MVC

#c# #asp.net #asp.net-mvc #entity-framework

#c# #asp.net #asp.net-mvc #entity-framework

Вопрос:

У меня есть функция, которая генерирует список рабочих заданий:

  public async Task<Object> GetAllWorkOrdersForUserAsync(string from,string to, int start, int length)
        {

                IQueryable<ReportWorkOrderViewModel> resp;
          
                resp = (from wo in _dbContext.WorkOrders
                        join woc in _dbContext.WorkOrderCategory on wo.WorkOrderCategoryId equals woc.Id
                        join sc in _dbContext.ServiceClients on wo.ServiceClientId equals sc.Id
                        join usr in _dbContext.Users on wo.UserId equals usr.Id into user
                        from uur in user.DefaultIfEmpty()
                        join contractor in _dbContext.Users on wo.ContractorId equals contractor.Id into contr
                        from contor in contr.DefaultIfEmpty()
                        select new ReportWorkOrderViewModel
                        {
                            Id = wo.Id,
                            WorkOrderType = woc.Name,
                            CustomerName = sc.FirstName   " "   sc.LastName,
                            CustomerAccount = wo.ServiceClientId,
                            AppointmentDate = wo.StartDateTime.ToString(),
                            IsHiring = (userId == wo.UserId),
                            CreatedAtDate = wo.CreatedAt.ToString(),
                            CreatedAtTime = wo.CreatedAt.ToString(),
                            CreatedBy = uur != null ? (uur.CompanyName != string.Empty ? uur.CompanyName : uur.ContactFirst   " "   uur.ContactLast) : string.Empty,
                            AssignedTechnician = contor != null ? (contor.ContactFirst   " "   contor.ContactLast) : string.Empty,
                            AppointmentTime = wo.StartDateTime.ToString(),
                            City = sc.City,
                            State = sc.State,
                            TicketStatus = wo.Status,
                            CompletionNote = wo.WorkPerformedDetail,
                            ClientsNote = wo.CustomerNotes,
                            TechStatus = wo.TechStatus == TechnicianStatus.Arrived ? "Arrivied" : wo.TechStatus == TechnicianStatus.OnTheWay ? "On The Way" : "Init",
                        });


            int totalRows = resp.Count();

            
            if (!string.IsNullOrEmpty(from) amp;amp; !string.IsNullOrEmpty(to))
            {
                try
                {
                    DateTime fromDate = DateTime.Parse(from);
                    DateTime toDate = DateTime.Parse(to);

                   resp = resp.AsEnumerable().Where(d => Convert.ToDateTime(d.AppointmentDate) >= fromDate amp;amp; Convert.ToDateTime(d.AppointmentDate) <= toDate).AsQueryable();
                }
                catch
                {
                }
            }


            int totalRowsAfterFiltering = resp.Count();
            //<!--sorting-->
            resp = resp.OrderBy(searchColumnName   " "   sortDirection);
            
           
            //<!--paging-->
            if (paginate)
            {
                if (totalRowsAfterFiltering != totalRows)
                {
                    resp = resp.Skip(start).Take(length);
                }
                else
                {
                    resp = resp.Where(x => x.Id >= start).Take(length);
                }
            }
            var response = new
            {
                data = resp,
                recordsTotal = totalRows,
                recordsFiltered = totalRowsAfterFiltering
            };

            return response;
        }

  

Моя ViewModel

  public class ReportWorkOrderViewModel
    {
        public int Id { get; set; }
        public string WorkOrderType { get; set; }
        public int CustomerAccount { get; set; }
        public string CustomerName { get; set; }

        private string appointmentDate;
        public string AppointmentDate { get => appointmentDate; set => appointmentDate = Convert.ToDateTime(value).ToString("MM/dd/yyyy"); }
        private string appointmentTime;
        public string AppointmentTime { get => appointmentTime; set => appointmentTime = Convert.ToDateTime(value).ToString("HH:mm tt"); }
        public string CreatedBy { get; set; }
}
  

Вышеупомянутая функция работает нормально и генерирует весь список, когда нет значения для From и To. Общее количество элементов в списке составляет 6-7000, но когда мне нужен список фильтрации данных по дате и времени. Моя система застревает в int totalRowsAfterFiltering = resp.Count(); этой части кода на 15-20 секунд и, наконец, заполняет только 2/3 данных. Но когда я не фильтрую по дате, список выполняется за 2 секунды. В чем здесь проблема?

Комментарии:

1. Можете ли вы попробовать без AsEnumerable() подобного: resp = resp.Where(d => Convert.ToDateTime(d.AppointmentDate) >= fromDate amp;amp; Convert.ToDateTime(d.AppointmentDate) <= toDate);

2. @Jaggan_j Я пытался без AsEnumerable(), но я получаю сообщение об ошибке « LINQ to Entities не распознает метод ‘System. DateTime Текущее время (System. Метод String)’, и этот метод не может быть преобразован в выражение хранилища. «`

3. Я думаю, что хорошей практикой является определение AppointmentDate data type как DateTime вместо string .