Я считаю, что это ограничение очень раздражает и противоречит общей тенденции не использовать SELECT * в запросах.
Тем не менее, для анонимных типов в c # есть обходной путь, выбирая объекты в анонимный тип, а затем копируя его в правильный тип.
Например:
var q = from emp in employees where emp.ID !=0
select new {Name = emp.First + " " + emp.Last, EmployeeId = emp.ID }
var r = q.ToList();
List<User> users = new List<User>(r.Select(new User
{
Name = r.Name,
EmployeeId = r.EmployeeId
}));
А в случае, когда мы имеем дело с одним значением (как в ситуации, описанной в вопросе), это еще проще, и нам просто нужно напрямую скопировать значения:
var q = from emp in employees where emp.ID !=0
select new { Name = emp.First + " " + emp.Last, EmployeeId = emp.ID }
var r = q.FirstOrDefault();
User user = new User { Name = r.Name, EmployeeId = r.ID };
Если имена свойств совпадают со столбцами базы данных, мы можем сделать это еще проще в запросе, выполнив select
var q = from emp in employees where emp.ID !=0
select new { emp.First, emp.Last, emp.ID }
Можно написать лямбда-выражение, которое можно автоматически копировать на основе имени свойства, без необходимости явно указывать значения.