LINQ против context.entity.Where () - PullRequest
       1

LINQ против context.entity.Where ()

1 голос
/ 18 августа 2011

Являются ли эти два блока абсолютно одинаковыми? Есть ли одно преимущество над другим?

        using (var context = new TRANSITEntities())
        {
            var result = context.Table1.Where(c => c.UserCode == "123");
        }


        using (var context = new TRANSITEntities())
        {
            var result = from c in context.Table1
                         where c.UserCode == "123"
                         select c;
        }

Ответы [ 5 ]

4 голосов
/ 18 августа 2011

Точно так же.

Вы можете убедиться в этом сами, посмотрев на ToString ()

    string query1String, query2String;
    using (var context = new TRANSITEntities())
    {
        var result = context.Table1.Where(c => c.UserCode == "123");
        query1String = result.Expression.ToString();
    }


    using (var context = new TRANSITEntities())
    {
        var result = from c in context.Table1
                     where c.UserCode == "123"
                     select c;
        var query2String = result.Expression.ToString();
    }

    Assert.AreEqual(query1String, query2String);

Следует также отметить, что result на самом деле НЕ результат.Это невыполненный / перечислимый IQueryable.Это означает, что это похоже на оператор SQL, который еще не выполнялся (вроде).Если бы вы сделали

    var t1 = result.ToArray()
    var t2 = result.ToArray()

, тогда запрос фактически будет выполнен дважды.t1 и t2 - РЕАЛЬНЫЕ результаты (массив в памяти) ... не result.Другими словами, result должно действительно называться query И, кроме того, приведенный выше пример никогда не сработает ... потому что если вы вызовете ToArray для результата вне блока using, он потерпит неудачу...потому что вы не можете выполнить запрос после удаления контекста:

    using (var context = new TRANSITEntities())
    {
        var result = context.Table1.Where(c => c.UserCode == "123");
    }
    // throws exception:
    var array = result.ToArray();
3 голосов
/ 18 августа 2011

Ну, первый выбирает из context.Table1, второй выбирает из context.LINTE. Поэтому они выбирают из совершенно разных коллекций.

Также первый выбирается в столбце UserCode, а второй - в столбце CodeUsager.

Кроме того ( является первым просто переводом второго, а вы забыли перевести второй ), код такой же. Компилятор C # просто переведет второй запрос в первый, и он будет вести себя одинаково.

2 голосов
/ 18 августа 2011

Они точно такие же. Компилятор преобразует синтаксис запроса в версию лямбда-выражения, прежде чем разрешит какие-либо методы.

1 голос
/ 18 августа 2011

Из книги Джулии Лерманс "Структура программирования Entity Entity:

Документация MSDN гласит: «В общем, мы рекомендуем синтаксис запроса потому что это обычно проще и удобочитаемее; однако, нет семантическая разница между синтаксисом метода и синтаксисом запроса. ”* Поэтому использование одного над другим - это вопрос стиля и личного выбор.

1 голос
/ 18 августа 2011

Если вы пытаетесь выбрать из разных таблиц, то они разные.

Но если таблицы одинаковые, то это просто представление другое.

Нет никакой разницы, это простопредпочтение тому, как вам нравится кодировать.

Все запросы linq преобразуются в Lambda перед созданием представления sql.

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