L2E - это одно и то же? - PullRequest
       11

L2E - это одно и то же?

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

Являются ли следующие два утверждения одинаковыми?

Users user = db.Users.First(u => (u.Username == username));

и

var user = from u in db.Users
          where u.Username == username
          select u;
Users aUser = user.First();

1 Ответ

3 голосов
/ 15 апреля 2010

Да, оба этих запроса идентичны по функции. Компилятор фактически возьмет второй запрос и переведет его в первый запрос, поскольку ключевые слова языка 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 для фильтрации результатов, а затем захватывает первую запись. Второй запрос использует два вызова метода, а первый - только один.

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