Для LINQ по SQL есть много онлайн-учебников, но это НЕ ВСТАВЛЯЕТ синтаксис SQL в виде строки в запрос LINQ. Вместо этого вы пишете код в том, что кажется правильным VB. NET кодом, со строгой проверкой типов и помощью автозаполнения, но он преобразуется в оператор SQL, фактически не выполняя ваш код, а вместо этого анализируя выражение деревья и используя отражение, чтобы попытаться увидеть, что вы хотите из базы данных и генерирует оператор SQL, чтобы получить его. Поскольку он преобразован и запущен на ядре базы данных, он имеет некоторые тонкие различия, например, типы, допускающие значения NULL, действующие немного по-разному в SQL, чем в Visual Basi c, и вы получаете поведение SQL.
Запрос, подобный следующему:
From Item in new DataContext().Items
WHERE Item.Key_Code>0
Order By Item.KEY_CODE
SELECT KeyCode=Item.KEY_CODE, Member=Item.Member
сгенерирует SQL, что почти отражает этот запрос. Чего он не сделает, так это перенесет всю таблицу «Предметы» в память и выполнит «где», «упорядочить по» или «Выбрать» в Visual Basi c.
Ваш код с
Dim output = (From row In datarows
Order By "KEY_CODE ASC"
Select row Distinct).CopyToDataTable()
начинается с объекта памяти (datarow), а не контекста данных, поэтому LINQ будет выполнен в Visual Basi c, который обладает гораздо большей мощностью, чем LINQ TO SQL. Он постоянно сравнивает «KEY_CODE AS C» как строку для каждой строки и, поскольку все результаты совпадают, он не может изменить порядок.
Измените его на что-то вроде этого:
Dim output = (From row In MyTable.Rows.Cast(of DataRow)
Order By row.item("KEY_CODE")
Select row Distinct).CopyToDataTable()
или
Dim output = (From row as DataRow In MyTable
Order By row.item("KEY_CODE")
Select row Distinct).CopyToDataTable()
Кстати, есть несколько способов обработки данных в выражениях LINQ, но из-за того, что Коллекции DataRow существовали до появления LINQ, это немного странно, поэтому я показал два альтернативных способа выполнения запросов LINQ к DataTable.