Как я могу получить sql-запрос, эквивалентный выражению linq

#c# #linq

#c# #linq

Вопрос:

Как я могу узнать, когда моя программа выполняет выражение linq, какой sql-запрос был выполнен?

Ответ №1:

Профилирование — это верный способ. В зависимости от поставщика LINQ это также может быть встроено, например, с помощью LINQ-to-SQL вы можете назначить что угодно .Log , и он будет записывать запросы по мере их выполнения. На самом простом уровне:

 dataContext.Log = Console.Out; // for a LINQ-to-SQL DataContext
// TODO: now execute some queries against dataContext
  

Внутри мы используем пользовательский ADO.NET стек для этого (и некоторых других вещей). Это выглядит как SqlConnection (и LINQ-to-SQL этим вполне доволен), но он выполняет для нас протоколирование и профилирование для каждой выполняемой команды, чтобы мы могли видеть, где находятся наши длительные операции. Я думаю, Sam хочет сделать это доступным для общественности, если вы хотите.

Комментарии:

1. Я использую ef? И я не могу найти свойство log. вы можете меня направить?

2. @LightWing — EF не является LINQ-to-SQL, поэтому нет . Свойство журнала. Однако, я подозреваю, что наш ADO.NET перехват будет работать нормально. Я проверил, и мы действительно планируем сделать это доступным в ближайшее время, но оно не будет протестировано на EF, просто потому, что мы не используем EF. Вы также могли бы рассмотреть возможность использования инструмента Ayende: efprof.com

Ответ №2:

Профилирование базы данных сделало бы это. Имейте в виду, что оператор не будет выполнен для базы данных, пока ваш код не отправится запрашивать результаты запроса.

Комментарии:

1. А если у меня нет доступа к базе данных?

2. Для этого решения требуется, чтобы у вас был доступ к базе данных.

3. Есть ли какое-либо другое решение?

Ответ №3:

Вы пробовали LINQPad?

Я полагаю, что это показывает SQL-прототип вашего запроса.

Комментарии:

1. Да, у меня есть linqpad и linqer.

2. @LightWing — И после того, как вы ввели в него свой LINQ-запрос, вы смотрели на вкладку SQL ниже?

Ответ №4:

  1. вы можете использовать SQL Profiler, поставляемый вместе с установкой SQL Server, и записывать инструкции по мере их выполнения
  2. вы можете использовать такой инструмент, как LINQPad, и запустить LINQ в вашем хранилище данных и изучить SQL в инструменте
  3. вы можете отладить свое приложение и получить SQL из ObjectQuery.ToTraceString метода

Ответ №5:

 var res = somequery;
Console.WriteLine(res);
  

Комментарии:

1. В настоящее время я ищу книгу, из которой я это прочитал. Но пока, да, я так думаю, поскольку он использовался в консоли. WriteLine