我正在尝试从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中,性能很差。
答案 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;你最终会在同一时间内通过多个任务迭代同一个表。