Подтвердить что ты не робот

LINQ to SQL не генерирует ORDER BY, когда используется DISTINCT?

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

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]
4b9b3361

Ответ 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 );

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

Ответ 2

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

попробуйте это

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

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