The visiting Union were defeated for the first time in Major League Soccer’s resumed season and for just the third time all year on Wednesday, with a 1-0 loss to the Columbus Crew at MAPFRE Stadium.

It won’t count as a moral victory, but the Union gave as good as they got against a team that showed again why it’s one of the league’s hardest to beat.

Columbus, which moved up to first place in the Eastern Conference with the win (6-1-2, 20 points) hasn’t given up a first-half goal all year. But the Union (4-2-3, 15 points) came close to being the first team to get one.

In the 26th, Brenden Aaronson burst brilliantly through two Columbus defenders, then had a shot blocked just off the goal line by Crew midfielder Artur. On the ensuing corner kick, Mark McKenzie beat goalkeeper Eloy Room with a low shot, but Darlington Nagbe cleared it off the line.

There were further corner kicks in the 32nd and 34th minutes, but the Union couldn’t jam the ball through a crowd as thick as Vine Street Expressway traffic at rush hour.

“It’s disappointing, because I thought we did enough to get a point out of the game,” Union manager Jim Curtin said. “But against the top teams, the upper-echelon teams in this league, on the road, you have to finish one of your chances we had in the first half.”

Columbus imposed itself early in the second half, and the Union got lucky when Pedro Santos shot wide left in the 51st minute. In the 54th, Andre Blake made a diving save and got crunched by Gyasi Zardes.

A minute later, Columbus finally broke through when Lucas Zelarayán smashed a shot from 22 yards that deflected in off McKenzie and left Blake helpless. It left the Union trailing in a game for just the third time all year.

Curtin made a double-substitution in the 62nd minute, withdrawing Aaronson and Alejandro Bedoya for Ilsinho and Warren Creavalle. Bedoya had played every minute of the season up to then.

Sergio Santos came up with a big chance to equalize when he sneaked through the Crew back line in the 68th minute and had Kacper Przybylko open across the goalmouth. Santos chose to shoot and aimed for the roof of the net, but he shot well over it.

Curtin made another double-sub in the 75th, sending in Andrew Wooten and Matt Real for Santos and Olivier Mbaizo — who started at left back with Kai Wagner out injured. Mbaizo was serviceable in the job, though it’s not his natural position.

The many moves led to a decent spell of possession for the Union but only half-chances. A 20-yard shot by Jamiro Monteiro in the 78th was easily saved. A rip from farther out by José Andrés Martínez in the 85th was also saved, though it took Room some effort.

Anthony Fontana replaced Martínez in the 88th minute to try to provide one last spark. The Union won back-to-back corner kicks in the dying seconds of stoppage time, and Blake came up to put an extra man in the box. But Columbus stopped both, and that was that.

“We allowed Columbus to go around us but not really through us,” Curtin said. “It was going to be a one-play game tonight, and they made the play and we didn’t.”

Crew manager Caleb Porter offered high praise in return, calling the Union “the best team we’ve played” this year.

Union defender Jack Elliott said there were positives to take from the game, including the team’s defensive shape and how many chances the attack created.

“But at the end of the day, it’s brought a bit of frustration,” he said. “Which may be good to spur us on for the next game.”

That next game comes up soon, Sunday at the New York Red Bulls (7 p.m., PHL17).