Выражения запроса обычно переводятся в вызовы методов расширения. (Они не имеют , но в 99,9% запросов используется IEnumerable<T>
или IQueryable<T>
.)
Точный алгоритм того, что делает этот метод, варьируется от метода к методу. В вашем примере запроса не будут использоваться хеш-таблицы, но, например, используются операции объединения или группировки.
Простой вызов Where
переводит что-то подобное в C # (с использованием блоков итераторов, которые, насколько я знаю, на данный момент недоступны в VB):
public static IEnumerable<T> Where(this IEnumerable<T> source,
Func<T, bool> predicate)
{
// Argument checking omitted
foreach (T element in source)
{
if (predicate(element))
{
yield return element;
}
}
}
Предикат предоставляется в качестве делегата (или дерева выражений, если вы используете IQueryable<T>
) и вызывается для каждого элемента в последовательности. Результаты передаются в потоковом режиме, а выполнение откладывается - другими словами, ничего не происходит до тех пор, пока вы не начнете запрашивать элементы из результата, и даже тогда он будет делать столько, сколько нужно для обеспечения следующего результата. Некоторые операторы не откладываются (в основном те, которые возвращают одно значение вместо последовательности), а некоторые буферизуют ввод (например, Reverse
должен прочитать до конца последовательности, прежде чем он сможет вернуть какие-либо результаты, потому что последний результат он читает первый, который он должен дать).
Боюсь, что выходит за рамки одного ответа - подробно описать каждого оператора LINQ, но если у вас есть вопросы по поводу конкретных, я уверен, что мы сможем вам помочь.
Я должен добавить, что если вы используете LINQ to SQL или другого провайдера, основанного на IQueryable<T>
, все будет по-другому. Класс Queryable
создает запрос (с помощью провайдера, который для начала реализует IQueryable<T>
), и затем провайдер обычно переводит запрос в более подходящую форму (например, SQL). Точные данные (включая буферизацию, потоковую передачу и т. Д.) Будут полностью зависеть от поставщика.