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

标签 performance entity-framework linq ado.net

我正在尝试从数据表中填充一个 View 模型(列表)。 客户和工作时间 WorkingTime 是客户的子列表。一个客户有多个条目。

使用 Adapter.Fill 方法

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 填充。

请提出更好的数据填充方法。

这里不能分页。

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

最佳答案

您可以尝试使用 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();

或者在您的“GetCustWorkingTime”中:

 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();

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

注意:同时使用两者可能会导致问题,因为在“GetCustWorkingTime”中,您最终会同时通过多个任务迭代同一个表。

关于performance - 在嵌套列表中填充数据的最快方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40859596/

相关文章:

c# - EF - 嵌套包含抛出错误

linq - 换语言时如何评估利弊

asp.net - 为什么 DbContext.SaveChanges 在 Debug模式下慢 10 倍

c++ - 派生类调用时的虚函数性能?

arrays - 数组中的稀有元素

.net - Entity Framework - 第一次查询很慢

Python 的多处理 : speed up a for-loop for several sets of parameters, "apply"与 "apply_async"

c# - 无法使用 Entity Framework 6 获取存储过程结果

c# - Linq 中的相关子查询

c# - IQueryable 表达式翻译