我的代码有些慢,有什么建议吗?

时间:2018-07-05 10:17:11

标签: asp.net-mvc performance entity-framework linq

我有一个大记录列表,我需要遍历每个记录,添加一些过滤器和计算并将其添加到另一个列表中。我认为一一进行会影响性能,因为要花900秒才能显示12条记录。

我无法确定为什么花了太长时间。我使用了chrome开发人员工具来确定运行缓慢的地方。然后我发现加载花费0.2秒,脚本花费3s,渲染花费3s,空闲时间是3s,其他时间是2秒。

也许我正在使用实体框架,而数据表却使它变慢了。也许我的查询有问题。以下是我的代码:

public ActionResult Index(int id, string language)
{
 var All_Employees = from employee in db.Employees
                     .Include(x => x.Country).Include(x => x.Status)
                     where enployee.GenderId == id
                     select employee ;

 var List = new List<EmployeeListViewModel>();

 foreach(var Record in All_Employees.ToList()
         .OrderByDescending(x=> ParseDate(x.JoiningDate)))
 {
      EmployeeListViewModel item = new EmployeeListViewModel();
      item.Id = Record.Id;
      item.Code = Record.Code;
      if(Record.CountryId != null)
      {
          if(language == "en")
          {
             item.Country = Record.Country.NameE;
          }
          else
          {
             item.Country = Record.Country.NameA;
          }
      }

      item.Date = Record.JoiningDate;
      int WorkingDays = 0;
      if(Record.JoiningDate != null)
      {
        DateTime Joining= Convert.ToDateTime(ParseDate(Record.Record.JoiningDate));

        TimeSpan t = DateTime.Now.Date - Joining;
        int Days = int.Parse(t.TotalDays.ToString());
        if (Days > 0)
        {
            WorkingDays = Days;
        }
      }
      item.Days = WorkingDays.ToString();

      if (Record.StatusId != null)
      {
         if (language == "en")
         {
            item.Status = Record.Status.NameE;
         }
         else
         {
            item.Status = Record.Status.NameE;
         }
      }

     List.Add(item);
 }
 return View(List);
}

另一个原因可能是我要转换日期:

private static DateTime? ParseDate(string dateString)
{
   if(dateString != null)
   {
     return DateTime.ParseExact(dateString, "dd-MM-yyyy", CultureInfo.GetCultureInfo("en-US"), DateTimeStyles.None);
   }
   else
   {
     return null;
   }           
}

由于某些原因,我不想将日期归档为DateTime。

在当前情况下提高性能的最佳方法是什么?

1 个答案:

答案 0 :(得分:-1)

您的代码中此处使用了过多的强制类型转换,并且创建了两次列表。一种执行如下代码的方法。

 List<EmployeeListViewModel> lstData = EmployeeListViewModel.ToList();
 for(int i = 0; i < lstData.Count; i++)
 {
     //Put logic here for required changes like Language and Date.
     if(lstData[i].CountryId != null)
     {
          if(language == "en")
             lstData[i].Country = lstData[i].Country.NameE;
          else
             lstData[i].Country = lstData[i].Country.NameA;
      }
 }

尝试减少专门用于字符串和日期时间的转换。下面是示例。

int Days = int.Parse(t.TotalDays.ToString());

在t.TotalDays以上行始终是int类型,无需再次转换为string和int。