PITTSBURGH – James McDonald scattered four hits over seven innings, Mike McKenry homered and the Pittsburgh Pirates edged the San Francisco Giants 3-1 on Saturday.

Neil Walker doubled twice and drove in a run while extending his hitting streak to 11 games and Joel Hanrahan worked the ninth to pick up his 23rd save.

Not even the hottest day in PNC Park’s brief history flustered McDonald, who worked efficiently in the 97-degree heat.

McDonald (9-3) struck out 10 and walked none, winning his fourth straight start and lowering his sparkling ERA to 2.37.

The Pirates have won 9 of 11 and are guaranteed at least a share of the NL Central lead through the All-Star break.

Ryan Theriot and Gregor Blanco had two hits apiece for the Giants, who have dropped 6 of 8.

NATIONALS 4, ROCKIES 1: Gio Gonzalez pitched six innings of three-hit ball to earn his 12th win, Ian Desmond homered, and Washington used a three-run sixth to beat visiting Colorado.

Gonzalez (12-3) won his fourth straight start to move into a tie with R.A. Dickey of the New York Mets for the major league lead in wins. Gonzalez allowed one run, walked three and struck out six.

METS 3, CUBS 1: Ike Davis homered, Jordany Valdespin hit one out for the second day in a row and Dillon Gee pitched one-run ball for eight innings to help New York win at home.

BRAVES 6, PHILLIES 3: Tommy Hanson pitched effectively into the eighth, Brian McCann homered and Atlanta won at Philadelphia.

CARDINALS 3, MARLINS 2: Kyle Lohse beat visiting Miami with seven innings of three-hit ball in 106-degree heat and Tony Cruz hit a go-ahead two-run triple.

Allen Craig had three hits and Skip Schumaker added an RBI single in the fourth for the Cardinals, who have won 5 of 7 and snapped the Marlins’ three-game winning streak.

ASTROS 6, BREWERS 3: Scott Moore homered for the second straight day, and J.D. Martinez and Jose Altuve had three hits each as host Houston took advantage of the first-inning ejection of Zack Greinke to break a season-long nine-game losing streak.

Greinke (9-3) was gone after four pitches — ejected after spiking the ball following a close play at first base.

AMERICAN LEAGUE

WHITE SOX 2, BLUE JAYS 0: Gavin Floyd pitched 72/3 innings of four-hit ball and Kevin Youkilis hit a two-run homer to lead Chicago over visiting Toronto.

The White Sox have won five straight to move a season-high 10 games over .500. They also have won a season-high seven straight at home.

RANGERS 4, TWINS 3: Nelson Cruz hit an RBI double in the 10th inning as host Texas snapped a five-game losing streak.

Texas’ Josh Hamilton had a home run, walk and a run scored as the DH one night after leaving in the fifth inning with back spasms.

INDIANS 7, RAYS 3: Ubaldo Jimenez struck out eight over six innings and Shelley Duncan hit a two-run homer to help Cleveland beat visiting Tampa Bay

TIGERS 8, ROYALS 7: Prince Fielder hit a two-run, tying homer in the first, Delmon Young had a two-run home run to pad the lead in the seventh inning and Detroit held on to win at home.