public async Task <ApiResult <bool> > SaveCorrection([FromBody] DTO.CounterpartyRestCorrection document) { try { var rests = await dbContext.CounterpartyMaterialRests .Where(x => x.CounterpartyId == document.CounterpartyId) .Select(x => new { x.MaterialId, x.Rest }) .ToListAsync(); int.TryParse(HttpContext.User.Identity.Name, out int userId); userId = await dbContext.Users .Where(x => x.Id == userId) .Select(x => x.Id) .FirstOrDefaultAsync(); var doc = new CounterpartyRestCorrection { CounterpartyId = document.CounterpartyId, Date = document.Date, IsDeleted = document.IsDeleted, UserId = userId, MaterialCorrections = document .MaterialCorrections .GroupJoin(rests, x => x.MaterialId, x => x.MaterialId, (x, y) => new { Corr = x, Rests = y }) .SelectMany(x => x.Rests.DefaultIfEmpty(), (x, rest) => new { x.Corr.MaterialId, Correction = x.Corr.Correction - (rest == null ? 0 : rest.Rest) }) .Adapt <List <CounterpartyRestCorrectionMaterial> >() }; dbContext.Database.BeginTransaction(); dbContext.CounterpartyRestCorrections.Add(doc); await dbContext.SaveChangesAsync(); repository.AddCounterpartyMaterialMovements(doc, doc.MaterialCorrections .Select(x => new CounterpartyMaterialMvt { CounterpartyId = doc.CounterpartyId, Date = doc.Date, MaterialId = x.MaterialId, Quantity = x.Correction })); await dbContext.SaveChangesAsync(); dbContext.Database.CommitTransaction(); } catch (Exception ex) { dbContext.Database.RollbackTransaction(); return(ApiResult(false, $"{ex.Message}\n{ex.InnerException?.Message}")); } return(ApiResult(true)); }