Проблема в том, что лямбда, которую вы используете в ForEach
, - это в основном метод async void
, что означает, что это огонь и забывание. Таким образом, ваш код доберется до return
до того, как завершит установку всех свойств Author
. Вместо этого вы должны использовать обычный foreach(var post in posts)
, поэтому метод будет ожидать установки всех свойств Author
. Обратите внимание, что причина, по которой это, скорее всего, дает сбой только в релизе, заключается в том, что это условие гонки, а отладка, вероятно, замедляет работу настолько, что этого не происходит.
В качестве альтернативы вы можете превратить код в метод и вместо этого выполнить его параллельно, а затем дождаться завершения всех задач перед возвратом.
[HttpGet("public/{orgId}")]
public async Task<ActionResult<List<PostModel>>> GetAllPublicPostsByOrgId(string orgId)
{
List<PostModel> posts = await _postRepository.GetAllPostsByOrgId(orgId);
var authorSetTasks = new List<Task>();
foreach(var post in posts)
{
authorSetTasks.Add(SetAuthor(post));
}
await Task.WhenAll(authorSetTasks);
return Ok(from post in posts where post.Published select post);
}
private async Task SetAuthor(PostModel post)
{
UserModel author = await _userRepository.GetUserById(post.AuthorId);
UserModel saveAuthor = new UserModel();
saveAuthor.FirstName = author.FirstName;
saveAuthor.LastName = author.LastName;
post.Author = saveAuthor;
}