Действительно ли возможно извлечь 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, чтобы сделать то, в чем я нуждаюсь?
Редактировать: подождите, вы говорите о 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 : Возможно, не невозможно, но, конечно, очень сложно.
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.
Это хорошо только во время отладки и не дает возможности программно получить к нему доступ.