LINQ to SQL не генерирует ORDER BY при использовании DISTINCT? - PullRequest
13 голосов
/ 19 марта 2012

Следующая базовая инструкция LINQ to SQL не приводит к работе заказа. Как вы можете видеть в T-SQL, нет порядка. Знаете почему?

LINQ to SQL:

      var results = (from stats in db.t_harvest_statistics
                       orderby stats.unit_number
                       select stats.unit_number).Distinct().ToList();

Выше приведены результаты в следующем TSQL

SELECT 
[Distinct1].[unit_number] AS [unit_number]
FROM ( SELECT DISTINCT 
[Extent1].[unit_number] AS [unit_number]
FROM [dbo].[t_harvest_statistics] AS [Extent1]
     )  AS [Distinct1]

Ответы [ 2 ]

28 голосов
/ 19 марта 2012

Это ограничение для 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 );

Счастливого кодирования.

0 голосов
/ 30 декабря 2017

У меня возникла та же проблема при сортировке года из таблицы транзакций.

попробуйте

 var results = (from stats in db.t_harvest_statistics
                       select stats.unit_number).Distinct().OrderBy(x =(Int16)x.unit_number).ToList();

после получения различного значения, используйте метод orderby

...