public async Task <IList <ProductoDto> > ListarProductos(string moneda, string filtro) { var task_intercambioResponse = _iIntercambioApiRepository.Obtener(moneda); var task_productos_proveedores = _iProveedoresApiRepository.ListarProductos(filtro); var task_lista_productos = _productosRepository.ListarProductos(filtro); var task_prioridad = _productosRepository.ObtenerPrioridadLocal(); List <Task> listaprocesos = new List <Task>(); listaprocesos.Add(task_intercambioResponse); listaprocesos.Add(task_productos_proveedores); listaprocesos.Add(task_lista_productos); listaprocesos.Add(task_prioridad); await Task.WhenAll(listaprocesos); var intercambioResponse = task_intercambioResponse.Result; var lista_productos = task_lista_productos.Result; var lista_proveedores = task_productos_proveedores.Result; int prioridad_local = task_prioridad.Result; filtro = filtro.ToLower(); var productosDto = lista_productos .Select( x => new ProductoDto() { id = x.Id, codigo = x.Codigo, fabricante = x.Fabricante, tipoProveedor = x.TipoProveedor, codigoProveedor = x.CodigoProveedor, nombre = x.Nombre, descripcion = x.Descripcion, categoria = x.Categoria, urlImagen = x.UrlImagen, precio = x.Precio, inventario = x.Inventario, precioOriginal = x.Precio, monedaOriginal = x.Moneda, prioridad = prioridad_local } ); List <ProductoDto> merge = productosDto.ToList(); merge.AddRange(lista_proveedores); var ordenada = merge .Where(x => (x.nombre.ToLower().Contains(filtro) || x.categoria.ToLower().Contains(filtro) || filtro == "all")) .OrderBy(x => x.prioridad); var final = ordenada.ToList(); final.ForEach(x => { x.moneda = moneda; x.precio = x.precio * intercambioResponse.valUSD; x.disponibilidad = (x.inventario > 0 ? "DISPONIBLE" : "NODISPONIBLE"); if (string.IsNullOrEmpty(x.urlImagen)) { x.urlImagen = "ud.png"; } }); return(final); }