Это ограничение для SQL и реляционной алгебры того, где ORDER BY по отношению к DISTINCT.
ORDER BY должен быть "дальше" в SQL (на "верхнем уровне"), поскольку это операция просмотра . В то время как один может написать SQL, который имеет ORDER BY "далее", в связи с операцией RA, это часто приводит к неопределенному поведению (которое иногда работает). В этом свете имеет смысл, что Linq2Sql может свободно игнорировать ORDER BY, хотя, возможно, исключение будет лучше ... в любом случае оно будет менее тонким ;-) (На самом деле, такая же проблема существует для любой поставщик Linq, который не предоставляет «более строгое» определение Distinct.)
Удалите Distinct()
, и Linq2Sql должен снова сгенерировать ORDER BY, как и ожидалось. Решение состоит в том, чтобы просто изменить порядок операций, чтобы ORDER BY снова оказался на «верхнем уровне».
Это описано в статье Использование Distinct и 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 );
Счастливого кодирования.