while (reader.Read() && items.Count < limit) { ... }

This only changes the logic for when limit == 0, but the new version is probably more correct for that edge case.