The result of the stored procedure is a collection of items (
IQueryable<T>). When you perform
FirstOrDefault you retrieve the first item in the collection or
default(T) if collection is empty.
T that you have is not an
IEnumerable<T> but an object representing a single record with 3 properties, so you do not have the
ToList() extension method.
Please refer to SO Linq FirstOrDefault Documentation to understand more