#怎么样才能避免在循环中对内存查数据,优化性能
1.当我们把数据从数据库中查询出来以后,这个时候我们的数据是放在内存里
var ProcessSegmentIds = datas?.Select(p => p.ProcessSegmentId).ToList();
var ProcessIds = datas?.Select(p => p.ProcessId).ToList();
var processSegmentDatas= Query<ProcessSegment>().Where(p => ProcessSegmentIds.Contains(p.Id)).ToList();
var processDatas= Query<Process>().Where(p => ProcessIds.Contains(p.Id)).ToList();
其中的processSegmentDatas,processDatas就是存在内存的数据
为了不让其在循环里去查询内存数据,节约性能,我们在循环外面定义了一个字典
var processSegmentDataMap = processSegmentDatas.ToDictionary(x => x.Id, x => x);
var processDataMap = processDatas.ToDictionary(x => x.Id, x => x);
这样子就节约性能 如整体代码断
var processSegmentIds = datas?.Select(p => p.ProcessSegmentId).ToList();
var processIds = datas?.Select(p => p.ProcessId).ToList();
var processSegmentDatas = Query<ProcessSegment>().Where(p => processSegmentIds.Contains(p.Id)).ToList();
var processDatas = Query<Process>().Where(p => processIds.Contains(p.Id)).ToList();
var processSegmentDataMap = processSegmentDatas.ToDictionary(x => x.Id, x => x);
var processDataMap = processDatas.ToDictionary(x => x.Id, x => x);
foreach (var item in datas)
{
ProcessRouteViewModel prv = new ProcessRouteViewModel();
processRouteViewModel.Add(prv);
ProcessSegment segment = null;
if (processSegmentDataMap.ContainsKey(item.ProcessSegmentId.GetValueOrDefault()))
{
segment = processSegmentDataMap[item.ProcessSegmentId.GetValueOrDefault()];
}
Process process = null;
if (processDataMap.ContainsKey(item.ProcessId))
{
process = processDataMap[item.ProcessId];
}
#总结
这样子我们的性能就由原来的A*B 变为A+B,这种方法可以对于数据量比较大那种。当然小数量的在内存里查询也不会影响太大的性能。希望这些能够帮到你们,当然大神勿喷。