Деревья выражений и Linq2Sql - PullRequest
1 голос
/ 13 августа 2011

В приведенном ниже запросе Linq2Sql кто-нибудь может мне сказать

1) Когда SQL-запрос отправляется на SQL-сервер?

a) Когда запросу назначено выражение или

b) (отложенное выполнение), когда оно требуется в цикле foreach?

var query = from c in myDataContext.Customers
            where c.FirstName == 'Tom'
            select c;

foreach(customer cust in query)
{
  //...do something
}

2) Преобразует ли приложение .NET или SQL Server дерево выражений в запрос SQL?Я спрашиваю об этом потому, что

a) Все чтения, которые я делал на деревьях выражений, говорят о том, что они были необходимы для динамической отправки кода по проводам вместо динамического выполнения.отправка MSIL.

b) Если я наведу курсор мыши на запрос после назначения ему выражения, я уже вижу, что оно изменило его на SQL

Если приложение .NET выполняет преобразование, то как в действительности можно сказать, что дерево выражений было отправлено по сети на сервер sql?Он только что отправил строку sql.

1 Ответ

2 голосов
/ 13 августа 2011
  1. Запрос отправляется в базу данных всякий раз, когда это абсолютно необходимо - обычно, когда вы на самом деле запрашиваете данные.

    Другими словами, , вероятно будет либо вызовом GetEnumerator(), либо первым вызовом IEnumerator<T>.MoveNext().

  2. Компилятор C # преобразует лямбда-выражение в IL, которое создает объект дерева выражений во время выполнения. Затем LINQ to SQL преобразует это дерево выражений в SQL для отправки в базу данных.

Деревья выражений необходимы для LINQ to SQL, чтобы иметь представление данных вашего кода, чтобы его можно было преобразовать в SQL во время выполнения. Это все еще SQL, который передается по сети, но для создания этого SQL требуются деревья выражений.

Есть множество постов в блогах на эту тему, включая это мной некоторое время назад.

...