public override bool ValidateDataProcess() { HashSet<Guid> ids = new(_coreRepository.Context.Set<CProgramme>().Select(i => i.Id)); bool successFlag = true; foreach (var cProgramme in Programmes) { if (ids.Contains(cProgramme.Id)) { _errorLogService.SaveErrorLogs(cProgramme.Id.ToString(), "Program Id already exists", _sheetName); successFlag = false; continue; } if (_coreRepository.Context.Set<CProgramme>().Any(s => s.Id != cProgramme.Id && s.Name.ToLower() == cProgramme.Name.ToLower() && s.SchoolId == cProgramme.SchoolId)) { _errorLogService.SaveErrorLogs(cProgramme.Id.ToString(), "Program name already exists", _sheetName); successFlag = false; continue; } ids.Add(cProgramme.Id); } return successFlag; }优化一下这段代码
时间: 2024-02-10 08:13:32 浏览: 284
Set-full-screen-and-key-exit.rar_android.setfull_android返回_full
可以考虑进行如下优化:
1. 将数据库查询操作放到方法外部进行,避免在循环中多次查询。
2. 将错误日志保存操作提取出来,避免在循环中多次调用。
3. 使用 LINQ 的 Any 方法代替 HashSet 的 Contains 方法,避免在 HashSet 中存储大量数据。
重构后的代码如下:
```
public override bool ValidateDataProcess()
{
var existingIds = _coreRepository.Context.Set<CProgramme>().Select(i => i.Id).ToHashSet();
bool successFlag = true;
foreach (var cProgramme in Programmes)
{
if (existingIds.Contains(cProgramme.Id))
{
SaveErrorLog(cProgramme.Id.ToString(), "Program Id already exists");
successFlag = false;
continue;
}
if (_coreRepository.Context.Set<CProgramme>().Any(s =>
s.Id != cProgramme.Id &&
s.Name.ToLower() == cProgramme.Name.ToLower() &&
s.SchoolId == cProgramme.SchoolId))
{
SaveErrorLog(cProgramme.Id.ToString(), "Program name already exists");
successFlag = false;
continue;
}
existingIds.Add(cProgramme.Id);
}
return successFlag;
}
private void SaveErrorLog(string id, string message)
{
_errorLogService.SaveErrorLogs(id, message, _sheetName);
}
```
阅读全文