如何最好地避免可能的多枚举,同时保持异步?



请考虑以下方法:

public async Task<IEnumerable<TORTDTransmissionOwner>> ReturnActiveTransmissionOwnersForUser(User inputUser)
{
_logger.LogDebug("ReturnActiveTransmissionOwnersForUser executing with user: {0}", inputUser.Email);
IEnumerable<TORTDTransmissionOwner> transmissionOwners;
if (inputUser.IsAdmin || inputUser.IsApprover)
{
transmissionOwners = await _toStakeholderUploadDataService.GetTORTDTransmissionOwners();
_logger.LogDebug("User isAdmin or isApprover, count of TOs: {0}", transmissionOwners.Count());
}
else
{
transmissionOwners = inputUser.TransmissionOwners.Where(to => to.IsImplemented)
.OrderBy(to => to.TORTDTransmissionOwner.Dbaname).Select(to => to.TORTDTransmissionOwner);
_logger.LogDebug("User is standard, count of TOs: {0}", transmissionOwners.Count());
}
return transmissionOwners;
}

目前,ReSharper 向我发出警告,指出我将导致数据库调用的结果多次枚举。

但是,如果我将数据库调用更改为:

public Task<IEnumerable<TORTDTransmissionOwner>> ReturnActiveTransmissionOwnersForUser(User inputUser)
{
_logger.LogDebug("ReturnActiveTransmissionOwnersForUser executing with user: {0}", inputUser.Email);
IEnumerable<TORTDTransmissionOwner> transmissionOwners;
if (inputUser.IsAdmin || inputUser.IsApprover)
{
transmissionOwners = _toStakeholderUploadDataService.GetTORTDTransmissionOwners().Result.ToList();
_logger.LogDebug("User isAdmin or isApprover, count of TOs: {0}", transmissionOwners.Count());
}
else
{
transmissionOwners = inputUser.TransmissionOwners.Where(to => to.IsImplemented)
.OrderBy(to => to.TORTDTransmissionOwner.Dbaname).Select(to => to.TORTDTransmissionOwner).ToList();
_logger.LogDebug("User is standard, count of TOs: {0}", transmissionOwners.Count());
}
return transmissionOwners;
}

我已经失去了对异步的需求,并强制每个数据库调用都是同步的。当我不使用调试日志记录时,我宁愿异步,对吧?

所以我的问题是,我如何在这里选择正确的方法?或者有没有办法更好地编写此方法,以便我可以在需要时同时拥有异步和调试语句?

您也可以在异步调用返回后具体化:

transmissionOwners = 
(await _toStakeholderUploadDataService.GetTORTDTransmissionOwners()).ToList();

最新更新