Join the group by result with the original rows and return the rows:
rows.Join(
rows.GroupBy(x => new {x.Location, x.Hour}),
x => new {x.Location, x.Hour, x.Available},
g => new {g.Key.Location, g.Key.Hour, Available = g.Max(p=>p.Available)},
(x1,g1) => x1
)
Put a profiler on and you will see this sql:
SELECT [t0].*
FROM [rows] AS [t0]
INNER JOIN (
SELECT MAX([t1].[Available]) AS [value], [t1].[Location], [t1].[Hour]
FROM [rows] AS [t1]
GROUP BY [t1].[Location], [t1].[Hour])
AS [t2] ON (
[t0].[Location] = [t2].[Location])
AND ([t0].[Hour] = [t2].[Hour])
AND ([t0].[Available] = [t2].[value]
)