public bool Producir(ushort recetaId, decimal CantidadAProducir, ushort BodegaId) { bool resultado = false; Expression <Func <Receta, bool> > elWhereDeReceta; elWhereDeReceta = n => n.RecetaId == recetaId; var ResultadoReceta = _recetaRepository.TraerUnoAsync(elWhereDeReceta , new List <string> { "RecetaDetalles" } //, "Artículo.ArtículoTipo" } ); var LaReceta = ResultadoReceta.Result; List <uint> ListaDeArtículos = new List <uint>(); foreach (RecetaDetalle unDetalle in LaReceta.RecetaDetalles) { ListaDeArtículos.Add(unDetalle.ArtículoId); } var Multiplicador = CantidadAProducir / LaReceta.CantidadProducida; Expression <Func <Inventario, bool> > elWhereDeInventario; elWhereDeInventario = n => n.BodegaId == BodegaId && ListaDeArtículos.Contains(n.ArtículoId); var ResultadoInventario = _inventarioRepository.TraerVariosSinTopeAsync(elWhereDeInventario , new List <string> { "Artículo", "Artículo.Unidad" } , null ); var ElInventario = ResultadoInventario.Result; // Validar la existencia de los componentes de la receta. List <string> NoCumplen = new List <string>(); var query = from artículoRec in LaReceta.RecetaDetalles join artículoInv in ElInventario on new { artículoRec.ArtículoId } equals new { artículoInv.ArtículoId } into XXX from UnaCosa in XXX.DefaultIfEmpty() select new { artículoId = artículoRec.ArtículoId, artículoRec.Artículo.Nombre, UnidadCódigo = artículoRec.Artículo.Unidad.Código, CantidadRequerida = artículoRec.Cantidad * Multiplicador, CantidadInventario = UnaCosa?.Cantidad ?? 0m }; // Si superamos la validación de existencia quitamos los insumos y aumentamos el resultado ushort CuantosNoCumplen = 0; foreach (var registro in query) { if (registro.CantidadInventario < registro.CantidadRequerida) { NoCumplen.Add($"No hay suficiente {registro.Nombre}. Se requieren {registro.CantidadRequerida} {registro.UnidadCódigo} y solo hay {registro.CantidadInventario}"); CuantosNoCumplen++; } } if (CuantosNoCumplen > 0) { throw new ApplicationException(NoCumplen.ToString()); } // Necesitamos disminuir el inventario de insumos // Luego aumentar el inventario de producto terminado // Finalmente SaveChanges return(resultado); }