【发布时间】:2020-05-28 09:28:12
【问题描述】:
我在应用程序中有这个简单的循环。 IEnumerablerels中的记录是468条,IEnumerableanalyzers中的记录是78条,所以每个analyzer在中有6条记录关系
IEnumerable<Reliability> rels = new Reliability().GetReliabilities()
.Where(m => m.StartDate >= startDate && m.EndDate <= endDate && m.ContractId == ContractId && m.JobOrderId == JobOrderId && analyzers.Any(x => x.Id == m.AnalyzerId))
.OrderBy(m => m.StartDate);
List<ReliabilityModel> model = new List<ReliabilityModel>();
foreach(Analyzer analyzer in analyzers)
{
long rel = rels.Where(m => m.AnalyzerId == analyzer.Id).Sum(m => m.ReliabilityHoursTicks);
long tot = rels.Where(m => m.AnalyzerId == analyzer.Id).Sum(m => m.TotalHoursTicks);
TimeSpan relHours = TimeSpan.FromTicks(rel);
TimeSpan totHours = TimeSpan.FromTicks(tot);
string relTime = ((int)Math.Truncate(relHours.TotalHours)).ToString() + ":" + relHours.Minutes.ToString("0#");
string totTime = ((int)Math.Truncate(totHours.TotalHours)).ToString() + ":" + totHours.Minutes.ToString("0#");
decimal value = Decimal.Divide(tot - rel, tot);
model.Add(new ReliabilityModel
{
AnalyzerTagName = analyzer.TagName,
AnalyzerTypeName = analyzer.AnalyzerTypeName,
ContractName = rels.Select(m => m.ContractName).FirstOrDefault(),
JobOrderName = rels.Select(m => m.JobOrderName).FirstOrDefault(),
ReliabilityHours = relTime,
TotalHours = totTime,
Value = value.ToString("P4")
});
}
问题是处理需要很长时间,大约 200 秒,我不明白为什么。 有什么想法吗?
【问题讨论】:
-
我会尝试几件事:1. 将 IEnumerable
rels 更改为 List rels 2. 提取 rels.Where(m => m.AnalyzerId == analyzer.Id) 成一个变量 -
你为什么检查
analyzers两次,在Where和Any?我想,这个analyzers.Any(x => x.Id == m.AnalyzerId)会慢很多。此外,IEnumerable<Reliability> rels似乎每次在循环中访问时都会被评估。您可以使用ToList()实现它 -
首先您想知道问题出在您的查询中还是在 foreach 中。为此,请暂时将 rels 设为
List.Reliability。这使得在执行 foreach 之前已经创建了所有 rel。衡量什么需要更多时间:制作列表或 foreach -
还值得问一下这是否是 EF,以及是否有机会延迟加载实体?
-
@DmitriTsoy 非常感谢。只需将 IEnumerable 更改为 List 即可,该过程在第二个之下。现在我必须检查我的所有应用程序以避免这种行为。
标签: c# linq loops model-view-controller