Краткий ответ:
Проблема в
IEnumerable<Reliability> rels = new Reliability().GetReliabilities()...
без ToList () в конце.
Вы вызываете GetReliabilities()
четыре раза на анализатор. Вероятно, GetReliabilities не просто возвращает список или что-то в этом роде, но на самом деле должен создать объект, содержащий все надежность.
Решение: добавьте .ToList (), прежде чем начинать его перечисление. Таким образом, надежность создается только один раз. последовательность, и пока у вас есть элемент, вы можете получить следующий, пока есть следующие элементы.
Имейте в виду, что перечисление IEnumerable<...>
может занять некоторое время, особенно при создании перечисленных объекты занимают некоторое время.
Итак, сначала вы создаете IEnumerable. Этот IEnumerable еще не был перечислен.
IEnumerable<Reliability> rels = ...
Затем вы начинаете перечислять последовательность ваших анализаторов:
foreach(Analyzer analyzer in analyzers)
{
long rel = rels.Where(m => m.AnalyzerId == analyzer.Id).Sum(m => m.ReliabilityHoursTicks);
Это означает, что для первого анализатора вы создаете все элементы, которые находятся в rels, и для каждого элемента вы решаете, хотите ли вы его сохранить. Из всех сохраненных элементов вы берете ReliabilityHoursTicks и суммируете их.
long tot = rels.Where(m => m.AnalyzerId == analyzer.Id).Sum(m => m.TotalHoursTicks);
Вы берете исходный запрос для rels, снова создаете все элементы, которые находятся в rels, и для каждого элемента ... (et c )
Позже:
ContractName = rels.Select(m => m.ContractName).FirstOrDefault(),
JobOrderName = rels.Select(m => m.JobOrderName).FirstOrDefault(),
В зависимости от того, насколько умен GetReliabilities()
, вы либо создаете один элемент rels, либо GetReliabilites выбирает все элементы, из которых вы используете только один
Итак, для каждого анализатора вы вызываете GetReliabilities четыре раза. Это ваше узкое место