это лишь лист от той партянки, в которой надо разобраться.
сложного ничего. да. но вот как с листа охватить взглядом реально вообще? специально не говорю какой контекст. т.к. тоже в первый раз отчет этот вижу. и даже не знаю работало там изначально или нет
просто мата не хватает. как такое можно поддерживать, не имея доступа к проду. и не зная как должно быть.
вот для кого пишут книжки типа канонической "чистый код"?
я бы на код ревью точно такое развернул нахрен. ну строк 10 кода, которые сможешь сразу прочитать — да. без проблем. но такое заворачивать.. НАХРЕНА???? Убил бы.
так он там блин еще коменты пишет о красоте кода....
var resultCollection = reportData.GroupBy(g => g.CropId).Select(g =>
{
var crop = g.First();
return new PlanExecutionControlReportItem
{
CropId = crop.CropId,
CropName = crop.CropName,
Technologies = g.GroupBy(t => t.TechnologyId).Select(t =>
{
var technologyFirst = t.First();
var dateRange = t
.Where(x => x.FactOperationSquare > 0)
.Select(x => x.FactDateEnd.Date)
.Distinct()
.OrderBy(d => d)
.ToArray();
if (t.Any(tr => tr.OperationGroupId.HasValue && tr.TreatmentId != Guid.Empty) && t.Key.HasValue)
{
var planExecutionControlItems = t.Where(x => x.OperationGroupId.HasValue).ToList();
var reportItem = new List<PlanExecutionControlReportTreatment>();
var excludedItems = new List<PlanExecutionControlItem>();
var operationGroupItems = planExecutionControlItems.GroupBy(x => x.OperationGroupId);
foreach (var group in operationGroupItems)
{
var operationTypeIds = operationTypes.Where(p => p.Value.Contains(group.Key.Value)).Select(p => p.Key).ToList();
operationTypeIds.Add(Guid.Empty);
var rows = group.Where(tr => tr.OperationGroupId == group.Key && operationTypeIds.Contains(tr.TreatmentId)).ToArray();
if (!rows.Any()) continue;
var operationItemRow = CreateReportItem(rows, dateRange, null, true);
reportItem.Add(operationItemRow);
var technologyOperation = rows.First();
var groupByTreatment = group.Where(tr => tr.OperationGroupId == group.Key && operationTypeIds.Contains(tr.TreatmentId)).GroupBy(x => x.TreatmentId);
foreach (var treatmentItems in groupByTreatment)
{
if (!treatmentItems.Any()) continue;
var treatmentRow = CreateReportItem(treatmentItems.ToArray(), dateRange, operationItemRow.Path.ToList(), false, operationItemRow.PlanDateBegin, operationItemRow.PlanDateStop, technologyOperation);
reportItem.Add(treatmentRow);
reportItem.AddRange(treatmentItems
.Where(tr => tr.OperationGroupId == group.Key && operationTypeIds.Contains(tr.TreatmentId))
.GroupBy(tr => new { tr.LayerId })
.Select(tr => CreateReportItem(tr.ToArray(), dateRange, treatmentRow.Path.ToList(), false, treatmentRow.PlanDateBegin, treatmentRow.PlanDateStop, technologyOperation))
.ToArray());
}
excludedItems.AddRange(group.Where(tr => tr.OperationGroupId == group.Key && !operationTypeIds.Contains(tr.TreatmentId)));
}
excludedItems.AddRange(t.Where(x => !x.OperationGroupId.HasValue));
reportItem.AddRange(excludedItems
.GroupBy(tr => new { tr.LayerId })
.Select(tr => CreateReportItem(tr.ToArray(), dateRange))
.ToArray());
return new PlanExecutionControlReportTechnology
{
TechnologyId = technologyFirst.TechnologyId,
TechnologyName = technologyFirst.TechnologyName,
Treatments = reportItem.OrderBy(tr => tr.TreatmentName).ToArray(),
};
}
if (t.Any(tr => tr.OperationGroupId.HasValue) && t.Key.HasValue)
{
var planExecutionControlItems = t.ToList();
var reportItem = new List<PlanExecutionControlReportTreatment>();
var excludedItems = new List<PlanExecutionControlItem>();
var operationGroupItems = planExecutionControlItems.GroupBy(x => x.OperationGroupId);
foreach (var group in operationGroupItems)
{
var operationTypeIds = operationTypes.Where(p => p.Value.Contains(group.Key ?? Guid.Empty)).Select(p => p.Key).ToArray();
var rows = group.Where(tr => tr.OperationGroupId == group.Key || operationTypeIds.Contains(tr.TreatmentId)).ToArray();
var operationItemRow = CreateReportItem(rows, dateRange, null, true);
reportItem.Add(operationItemRow);
reportItem.AddRange(rows
.Where(tr => tr.OperationGroupId == group.Key || operationTypeIds.Contains(tr.TreatmentId))
.GroupBy(tr => new { tr.LayerId })
.Select(tr => CreateReportItem(tr.ToArray(), dateRange, operationItemRow.Path.ToList()))
.ToArray());
excludedItems.AddRange(group.Where(tr => tr.OperationGroupId == group.Key && !operationTypeIds.Contains(tr.TreatmentId)));
}
excludedItems.AddRange(t.Where(x => !x.OperationGroupId.HasValue));
reportItem.AddRange(excludedItems
.GroupBy(tr => new { tr.LayerId })
.Select(tr => CreateReportItem(tr.ToArray(), dateRange))
.ToArray());
return new PlanExecutionControlReportTechnology
{
TechnologyId = technologyFirst.TechnologyId,
TechnologyName = technologyFirst.TechnologyName,
Treatments = reportItem.OrderBy(tr => tr.TreatmentName).ToArray(),
};
}
return new PlanExecutionControlReportTechnology
{
TechnologyId = technologyFirst.TechnologyId,
TechnologyName = technologyFirst.TechnologyName,
Treatments = t
.GroupBy(tr => new { tr.TreatmentId, tr.LayerId })
.Select(tr => CreateReportItem(tr.ToArray(), dateRange))
.OrderBy(tr => tr.TreatmentName)
.ToArray()
};
}).OrderBy(t => t.TechnologyName).ToArray()
};
}).OrderBy(g => g.CropName).ToArray();
Здравствуйте, nikkit, Вы писали:
N>это лишь лист от той партянки, в которой надо разобраться.
N>сложного ничего. да. но вот как с листа охватить взглядом реально вообще? специально не говорю какой контекст. т.к. тоже в первый раз отчет этот вижу. и даже не знаю работало там изначально или нет
Сочувствую.
N>просто мата не хватает. как такое можно поддерживать, не имея доступа к проду.
Ну это вопрос решаемый. Например, можно попросить копию базы с прода, в которой каким-то способом зашифрована вся секретная информация.
Ну типа строчки типа имен конвертированы во что-то и числа типа зарплат.
N>вот для кого пишут книжки типа канонической "чистый код"?
N>я бы на код ревью точно такое развернул нахрен. ну строк 10 кода, которые сможешь сразу прочитать — да. без проблем. но такое заворачивать.. НАХРЕНА???? Убил бы.
N>так он там блин еще коменты пишет о красоте кода....
Да ничего страшного. Write-Only код
Здравствуйте, nikkit, Вы писали:
Я бы сюда добавил, что использование синтаксис запроса намного лучше читается.
https://habr.com/ru/companies/otus/articles/723438/
Совмещение Linq и foreach.
в 1С например есть конструкторы запросов. Там простыни по 10 листов нормальное явление
В Linq это решается через промежуточные запросы. Но есть проблемы с анонимными классами, которых надо явно объявлять.
А вообще конечно удобно сворачивать подзапросы и раскрывать их по необходимости.
Ну это можно решить через #region и #endregion
Есть конструкторы запросов
https://www.linqpad.net
Где тоже было бы удобно сворачивать разворачивать подзапросы
нормальный код просто ранняя итерация. тебе повезло, что есть хотя бы какое количество форичей, человек видимо не смог протащить логику через линк, а есть те, кто могут, вот их код читать — истинное удовольствие, не говоря о дебаге.