Это действительно очень просто: Singleвозвращает один элемент и генерирует исключение, если их нет или больше одного элемента. Firstвернет первый элемент или выбросит, если его нет. FirstOrDefaultвернет первый элемент или значение по умолчанию ( nullв случае, если данный тип является ссылочным), когда элемент отсутствует.
Это то поведение, которое должен иметь API. Однако обратите внимание, что базовая реализация может иметь другое поведение. В то время как Entity Framework подчиняется этому, O / RM, такой как LLBLGen, также может возвращаться nullпри вызове, Firstчто очень странно. Это было очень странно (и упрямый) решение дизайнера ИМО.