однако для меня это выглядит так, как будто запускает запрос, и после того, как это сделано, он выбирает первый
Нет. Запрос в скобках возвращает объект IQueryable, который в основном является представлением запроса, который еще не был выполнен. Только когда вы вызываете .First (), он действительно обрабатывает объект IQueryable и переводит его в запрос к базе данных, и, не глядя, я гарантирую, что он запрашивает базу данных только для первого элемента.
Однако, если выесли бы написать .ToList (). First () вместо просто .First () (и вы видите, что новички совершают эту ошибку менее очевидными способами), он действительно загрузит все в память и затем извлечет из нее первый объект.
Но вставленный вами код очень эффективен.