在我们的代码中,我们将域实体映射到API DTO对象。在转换实体的过程中返回了大量的记录。当我们尝试将这些记录映射到DTO时需要花费大量时间。 这是示例
Class test
{
public virtual int ID { get; protected internal set; }
public virtual Employee Employee { get; protected internal set; }
public virtual BusinessDate Start { get; protected internal set; }
protected internal virtual IList<ABC> _abc { get; set; }
public virtual IEnumerable<ABC> ABCRange{
get
{
return _abc;
}
}
public IEnumerable<test> GetByEmployees(IEnumerable<int> employees)
{
return ChunkIDsQueryForSQLServer2100Limit(employees, empArray =>
(from ar in GetAllAsQueryable()
where empArray.Contains(ar.Employee.ID)
select ar).ToList());
}
class ABC
{
public virtual int ID { get; protected internal set; }
public virtual int DayOfWeek { get; protected internal set; }
public virtual bool StartTimeOffset { get; protected internal set; }
public virtual bool EndTimeOffset { get; protected internal set; }
public virtual AvailabilityType Type { get; protected internal set; }
}
DTO Mapper:
return new AvailabilityRequestCollectionResource
{
AvailabilityRequests = availabilityRequest.Select(AvailabilityRequestMap).ToList()
};
private static TEST2 AvailabilityRequestMap(TEST test)
{
var availabilityRequestResource = new TEST2
{
ID = availabilityRequest.ID,
EmployeeID = availabilityRequest.Employee.ID,
GeneralAvailability = AvailabilityTypeMap(availabilityRequest.ABCRange.Where(f => f.Type == AvailabilityType.General)),
PreferredAvailability = AvailabilityTypeMap(availabilityRequest.ABCRange.Where(f => f.Type == AvailabilityType.Preferred))
};
}
private static List<XYZ> AvailabilityTypeMap(IEnumerable<ABC> abc)
{
var availList = new List<XYZ>();
availList.AddRange(abc.Select(x =>
new XYZ
{
ID = x.ID,
DayOfWeek = (Day)x.DayOfWeek,
StartTimeOffset = x.StartTimeOffset,
EndTimeOffset = x.EndTimeOffset,
WeekNumber = 1
}
));
return availList;
}
现在的问题是上面的方法花费了大约15秒来创建说出10k的XYZ对象。我们的性能瓶颈是2秒,每次都是。对象可能会有所不同怎么做? 我们尝试了并行性和任务性,这些都没有帮助,因为域中的延迟加载已到位,我们无法修改。
注意:ABC和XYZ没有相同的属性集
由于
答案 0 :(得分:1)
来自域的延迟加载
几乎可以肯定 100%的瓶颈。
我们无法修改
然后你无法解决它。
您需要挑战延迟加载,或者做一些事情以先发制人地高效地加载 (即不是每个项目 - n + 1是残酷的)。
创建10k对象并从存在的中填充应该是非常即时的(只要实现不做任何愚蠢的事情)。这不是问题,并且盯着那样做的代码:无济于事。