Да, оба этих запроса идентичны по функции. Компилятор фактически возьмет второй запрос и переведет его в первый запрос, поскольку ключевые слова языка LINQ являются просто расширением языка C #.
Вот аналогичный пример, который показывает, что это правда:
using System;
using System.Linq;
class Example
{
static void Main()
{
var names = new[] { "Andrew", "Nicole", "Michael",
"Joe", "Sammy", "Joshua" };
var shortNames = from n in names
where n.Length == 6
select n;
var first = names.First();
}
}
Используя Reflector, я смог увидеть фактический скомпилированный код:
internal class Example
{
private static void Main()
{
string[] names = new string[] { "Andrew", "Nicole", "Michael", "Joe", "Sammy", "Joshua" };
IEnumerable<string> shortNames = names.Where<string>(delegate (string n) {
return n.Length == 6;
});
string first = names.First<string>();
}
}
Как видите, введенный мной синтаксис запроса был изменен компилятором для вызова методов расширения из класса Enumerable
. Ключевые слова запроса LINQ просто удобны для разработчика, поскольку компилятор преобразует их в вызовы методов.
Редактировать: Я заметил одно различие между вашими двумя запросами, которое я не заметил на первый взгляд. Ваш первый запрос будет выполняться немного быстрее, поскольку он передает предикат методу First
. Это будет быстрее, так как ваш второй запрос сначала использует метод Where
для фильтрации результатов, а затем захватывает первую запись. Второй запрос использует два вызова метода, а первый - только один.