Ответ 1
Это ограничение SQL и реляционной алгебры, где ORDER BY относится к DISTINCT.
ORDER BY должен быть "более удаленным" в SQL (на "верхнем уровне" ), поскольку это операция просмотра. Хотя можно написать SQL, у которого ORDER BY "дальше", в связи с операцией RA, это часто приводит к Undefined Behavior (что иногда работает). В этом свете имеет смысл, что Linq2Sql может игнорировать ORDER BY, хотя, возможно, исключение было бы лучше... в любом случае было бы менее тонко;-) (Фактически, эта же проблема существует для любого поставщика Linq, который не предоставляет "более строгие" определения Distinct.)
Удалите Distinct()
, и Linq2Sql должен снова сгенерировать ORDER BY, как и ожидалось. Решение состоит в том, чтобы просто переключить порядок операций, чтобы ORDER BY снова находился на "верхнем уровне".
Это описано в статье Использование отличительных и OrderBy в LINQ:
Такое поведение может показаться странным. Проблема заключается в том, что оператор Distinct не гарантирует, что он сохранит исходный порядок значений. Применительно к LINQ to SQL это означает, что ограничение сортировки можно игнорировать в случае запроса типа queryA.
Решение довольно похоже на: поставьте оператор OrderBy после Distinct, как в следующем определении queryB:
var queryB = (from o in db.Orders select o.Employee.LastName) .Distinct().OrderBy( n => n );
Счастливое кодирование.