каков порядок выполнения этой функции: var queryResult = names.OrderBy (item => item) .Where (it => it.StartsWith ("S")) - PullRequest
2 голосов
/ 20 апреля 2010

каков порядок выполнения этой функции:

var queryResult = names.OrderBy(item => item).Where(it => it.StartsWith("S"))

Ответы [ 3 ]

1 голос
/ 20 апреля 2010

Это зависит от того, что names. Если вы используете Linq-to-SQL, он будет скомпилирован в один SQL-запрос, который заканчивается:

WHERE `item` LIKE 'S%'
ORDER BY `item` ASC

и, вероятно, сделано в этом порядке бэкэндом базы данных.

Что касается работы с нормальной структурой данных (такой как List<T>), я бы согласился с тем, что они будут выполняться в порядке слева направо.

1 голос
/ 20 апреля 2010

Я предполагаю, что names - это проекция столбца из простой таблицы, например:

var names = ctx.SomeTable.Select(row => row.Name);

Хорошо, что само по себе на самом деле не выполняет ; он строит составленное представление запроса, которое (извне):

  1. Where [предикат]
  2. (упаковка) OrderBy [селектор]
  3. (упаковка) Select [селектор]
  4. (упаковка) запроса таблицы

Ничего не происходит, пока вы не выполните итерацию данных (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 это не имеет значения.

0 голосов
/ 20 апреля 2010

Простой ответ: WHERE, затем ORDER BY.

Более сложный ответ: запрос LINQ будет преобразован в запрос SQL (по тегу linq-to-sql), так что это деталь реализации SQL-сервера. Обычно он сначала запускает предложение WHERE, а затем упорядочивает результаты (чтобы сэкономить затраты на сравнение результатов, которые даже не нужно возвращать), но я полагаю, что вначале он может выполнить упорядочение, если его упорядочивает кластерный индекс или что-то в этом роде.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...