Извлеките запрос SQL из выражений LINQ

Действительно ли возможно извлечь sql операторы из запросов LINQ?

Скажите, у меня есть это выражение LINQ.

        string[] names =
            new string[] { "Jon Skeet", "Marc Gravell", "tvanfosson", 
                           "cletus", "Greg Hewgill", "JaredPar" };

        var results = from name in names
                      where name.StartsWith("J")
                      select name;

сопроводительный текст http://ruchitsurati.net/files/linq-debugging.png

После того, как этот оператор 'заканчивается', только содержит выражение LINQ а не результаты из-за задержанного выполнения запросов LINQ.

Я могу извлечь или произвести запрос LINQ из 'результатов' и подготовить допустимый SQL-оператор от запроса, сохраненного в 'LINQ'?

Править

Вот Моя цель:

Мы записали наш собственный ORM. Мы должны записать запросы каждый раз, мы должны сделать операции дб. Теперь мы должны избавиться от него в DAL. Мы хотим записать выражение LINQ в коде, который произведет SQL-операторы против моего ORM, и мы выполним этот SQL на базе данных.

Буду я haev, чтобы записать моим пользовательским Поставщикам Linq, чтобы сделать то, в чем я нуждаюсь?

14
задан this. __curious_geek 8 January 2010 в 06:15
поделиться

2 ответа

Редактировать: подождите, вы говорите о LINQ к объектам? Нет, это невозможно 1 . Нет никакого способа преобразовать дерево выражения для LINQ для объекта для объекта, чтобы дерево выражения, которое представляет запрос некоторой базы данных.

Редактировать: не пишите, что вы владеете ORM. Есть проверенные решения этой проблемы. Вы тратите ценность, пытаясь решить эту проблему снова. Если вы собираетесь использовать свой собственный ORM, чтобы перевести выражение в оператор SQL, да, вам придется написать свой собственный поставщик. Вот прохождение на MSDN это.

Но серьезно, не пишите свой собственный ORM. Пять лет назад до Nibernate и Linq к SQL пришли и созревали, хорошо. Но не сейчас. Ни за что.

Остальная часть этого ответа предположила, что вы спрашивали о LINQ для SQL.

Есть два способа, о которых я знаю.

Сначала:

Установите свойство DataContext.log на Console.out (или другой System.io.textWriter по вашему выбору):

var db = new MyDataContext();
db.Log = Console.Out;

Это будет распечатать операторы SQL к консоли, поскольку они выполняются. Для получения дополнительной информации см. MSDN . В других местах примеры из TextWriter , которые позволяют отправлять вывод на окно вывода отладчика.

Второе:

Используйте LINQ для SQL Rebug Visualizer из Скотта Гутрири. Это позволяет увидеть операторы SQL через отладчик в Visual Studio. Эта опция имеет преимущество, которое вы можете увидеть оператор SQL без выполнения запроса. Вы можете даже выполнить запрос и увидеть результаты в визуализаторе.

1 : Возможно, не невозможно, но, конечно, очень сложно.

22
ответ дан 1 December 2019 в 07:06
поделиться

EDIT #2: обновление и уточнение полностью изменило вопрос.

Звучит так, как будто вы заново изобретаете колесо и пытаетесь сделать то, что LINQ к SQL и LINQ к сущностям уже делают. Например, провайдеры просматривают деревья выражений и сопоставляют определенные функции с SQL Server. Вы бы взялись за большую задачу, которую нам уже предоставила компания Microsoft и тщательно протестировала.

Вам было бы гораздо лучше использовать существующие решения ORM, будь то Microsoft или NHibernate и т.д.


EDIT #1: нашел это, я знал, что видел что-то для этого раньше, но это ускользнуло от меня.

Вы можете использовать метод DataContext.GetCommand для получения сгенерированного SQL:

var query = dc.Persons.Take(1);
string generatedSql = dc.GetCommand(query).CommandText;

Этот пример возвращает следующий SQL из базы данных AdventureWorks:

SELECT TOP (1) [t0]. [BusinessEntitytyID], [t0]. [PersonType], [t0]. [NameStyle], [t0].[Title], [t0].[FirstName], [t0].[MiddleName], [t0].[LastName], [t0]. [суффикс], [t0]. [EmailPromotion], [t0]. [AdditionalContactInfo], [t0]. [Демография], [t0]. [rowguid] AS. [Rowguid], [t0]. [ModifiedDate] FROM. [Person]. [Person] AS [t0]


Еще один вариант определения сгенерированных заявлений будет доступен в VS2010 через IntelliTrace (ранее известный как исторический отладчик). Дополнительную информацию и скриншоты смотрите в этом посте блога: Отладка LINQ-запросов к SQL-запросам с помощью Historical Debugger.

Это хорошо только во время отладки и не дает возможности программно получить к нему доступ.

16
ответ дан 1 December 2019 в 07:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: