我正在尝试从数据表中填充一个 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/