填充嵌套列表中数据的最快方法

时间:2016-11-29 06:59:14

标签: performance entity-framework linq ado.net

我正在尝试从Datatable填充viewmodel(List)。 客户和工作时间 WorkingTime是一个子客户列表。客户有几个条目。

使用Adapter.Fill Meathod

DataTable dtCust=GetCustomersInTable(Uid); 
DataTable dtWorking=GetAllCustWorkTimeInTable(Uid); 


var Customers = (from C in dtCust.AsEnumerable()
   select new CustomerViewModel
   {
       CustomerId = (long)C["CustomerId"],
       Address1 = DBNull.Value == C["Name"] ? "" : Convert.ToString(C["Name"]),
       Address2 = DBNull.Value == C["Address"] ? "" : Convert.ToString(C["Address"]),
       City = DBNull.Value == C["City"] ? "" : Convert.ToString(C["City"]),
       WorkingTime = GetCustWorkingTime(dtWorking, Convert.ToInt64(C["CustomerId"])),
    }}).ToList();



private List<CustomerWorkingTime> GetCustWorkingTime(DataTable dtWorking, long CustomerId)
{
        var CustomerWorkingTimes = (from C in dtWorking.AsEnumerable()
                      where Convert.ToInt64(C["CustomerId"]) == CustomerId
                      select new CustomerWorkingTime
                      {                       
                          AfterNoonFrom = Convert.ToDateTime(C["AfterNoonFrom"]),
                          AfterNoonUntil = Convert.ToDateTime(C["AfterNoonUntil"])                                       

                      }).ToList();
        return result;

}

我需要获取整个数据。它不用于在UI中显示。 这个方法花费了太多时间来填充数据。特别是CustomerWorkingtime Filling。

请建议更好的方法来填充数据。

此处无法进行分页。

现有的设置在EntityFramework中,性能很差。

1 个答案:

答案 0 :(得分:1)

Yu可以尝试使用TPL Parallel.ForEach,我认为在你的情况下,这可能会给你一个提升。

例如:

var Customers = Parallel.ForEach(dtCust.AsEnumerable(), c => 
   select new CustomerViewModel
   {
       CustomerId = (long)C["CustomerId"],
       Address1 = DBNull.Value == C["Name"] ? "" : Convert.ToString(C["Name"]),
       Address2 = DBNull.Value == C["Address"] ? "" : Convert.ToString(C["Address"]),
       City = DBNull.Value == C["City"] ? "" : Convert.ToString(C["City"]),
       WorkingTime = GetCustWorkingTime(dtWorking, Convert.ToInt64(C["CustomerId"])),
    }}).ToList();

或者在你的&#34; GetCustWorkingTime&#34;:

 var result=  dtWorking
                              .AsEnumerable()             
                              .AsParallel()
                              .Where(c => Convert.ToInt64(C["CustomerId"]) == CustomerId)
                             .Select(c= >  new CustomerWorkingTime
                             {                       
                               AfterNoonFrom = Convert.ToDateTime(C["AfterNoonFrom"]),
                               AfterNoonUntil = Convert.ToDateTime(C["AfterNoonUntil"])                                       
                      }).ToList();

你应该单独尝试它们,并一起看看哪一个给你最好的性能(取决于表的大小)。

注意:同时使用两者可能会导致问题,因为在&#34; GetCustWorkingTime&#34;你最终会在同一时间内通过多个任务迭代同一个表。