Как уже упоминалось, это связано с кодом, над которым работает LINQ To SQL.
Вы должны посмотреть на это немного так. В вашем первом примере - если мы посмотрим на выражения (то есть на дерево выражений), которые сгенерирует GetPeople, - человеческими словами он создаст дерево, которое указывает, что мы выбираем из нашей таблицы, - а затем применим функцию MapToDomain к каждой строке в этой таблице. который возвращает объект типа DomainPerson.
Во втором примере на этот раз мы не только знаем, что возвращаемый тип имеет DomainPerson, но мы также можем видеть, какие поля сопоставляются с какими свойствами (и, что еще более важно, как). Это означает, что когда вы в дальнейшем запустите свой Where и ссылку p.Quality, Linq To SQL может отследить это до таблицы SQL и будет знать, что DomainPerson.Quality отображается на столбец Quality в таблице Persons.
Поначалу может показаться странным, что первый пример не работает, но предположим, что ваша модель MapToDomain выглядит так:
public void DomainPerson MapToDomain(Data.Person person){
return new DomainPerson {
Quality = person.Quality + " Quality";
//mode code here
};
}
Теперь, как LINQ To SQL должен знать это "специальное" отображение? - ответ прост - не может.
Проще говоря, когда вы что-то делаете в своем операторе выбора и хотите проецировать свой результат, фактическое проецирование должно происходить как «встроенный» код (я не уверен в точном термине для этого), если после этого вы хотите больше выполнять запросы (т. е. упорядочивать, фильтровать и т. д.), иначе у движка запросов не будет ни единого шанса узнать, как работает ваше отображение.