#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
.