Я предполагаю, что names
- это проекция столбца из простой таблицы, например:
var names = ctx.SomeTable.Select(row => row.Name);
Хорошо, что само по себе на самом деле не выполняет ; он строит составленное представление запроса, которое (извне):
Where
[предикат]
- (упаковка)
OrderBy
[селектор]
- (упаковка)
Select
[селектор]
- (упаковка) запроса таблицы
Ничего не происходит, пока вы не выполните итерацию данных (foreach
, GetEnumerator()
и т. Д.) Или вызовете First
(и т. Д.). С помощью LINQ-to-SQL (из тегов) он затем создает один запрос TSQL (что делает «порядок выполнения» проблемой только для самого движка БД), подходящий для текущего соединения (специфический вариант SQL-Server), который будет выглядеть примерно так:
SELECT row.Name
FROM [dbo].[SomeTable] row
WHERE row.Name LIKE @p1
ORDER BY row.Name
вероятно, передавая 'S%'
как @p1
.
Если бы это были LINQ-to-Objects, данные извлекаются извне, каждый слой запрашивает данные у внутренних слоев и фильтрует / манипулирует ими по мере необходимости. Таким образом, с LINQ-to-Objects имеет смысл сделать Where
перед OrderBy
. С LINQ-to-SQL это не имеет значения.