Concat
действительно игнорирует предложение order by, когда речь идет о LINQ to SQL. Это можно проверить из сгенерированного SQL, если вы используете LINQPad или настроите свойство DataContext.Log
.
Один из способов справиться с этим - ввести фиктивное значение через анонимный тип, чтобы помочь с упорядочением. Для ясности я разделил запросы ниже, хотя тот же подход возможен с использованием синтаксиса запросов, с которого вы начинали до тех пор, пока вам не потребуется указать порядок.
Dim firstQuery = From items In myDatabase.ItemAssignments _
Where items.BuildingID = buildingID _
And items.ResidentID = ResidentID _
Select New With { .Row = items, .Order = 1 }
Dim secondQuery = From moreitems In myDatabase.ItemAssignments _
Where moreitems.occupied = 0 _
And moreitems.BuildingID = buildingID _
Select New With { .Row = moreitems, .Order = 2 }
Dim query = firstQuery.Concat(secondQuery) _
.OrderBy(Function(o) o.Order) _
.ThenBy(Function(o) o.Row.Floor) _
.ThenBy(Function(o) o.Row.ItemNumber) _
.Select(Function(o) o.Row)
Другим менее желательным вариантом является вызов метода AsEnumerable
для одного из запросов, который будет извлекать результаты из базы данных. В зависимости от количества задействованных элементов и необходимости дальнейшей фильтрации это может отрицательно сказаться на производительности.
Чтобы использовать этот подход, измените первую часть исходного запроса:
From items In myDatabase.ItemAssignments.AsEnumerable() ...
Порядок второй части будет работать так, как задумано, и сгенерированный SQL будет отражать столько же.