Linq to Entities: см. результирующий запрос (context.Log = Console.Out)

Я только что понял, что если ваше приложение С# использует классы LINQ-TO-SQL для взаимодействия с базой данных, вы можете сделать свой запрос следующим образом:

        using (DatabaseContext context = new DatabaseContext())
        {
            context.Log = Console.Out;
            var query = from Person p in context.People
                        where person.Name == "john"
                        select p;                                
            Console.WriteLine(query.Name);
        }

Что эквивалентно в LINQ-TO-ENTITY (это другое название ADO.NET?) для
context.Log = Console.Out
Или есть другой способ увидеть ваш фактический SQL-запрос к базе данных?


person nobody    schedule 12.02.2011    source источник
comment
возможный дубликат Как вести журнал Entity Framework SQL   -  person Gabe    schedule 12.02.2011


Ответы (5)


Я всегда использую SQL Profiler, если у вас есть MS SQL Server. Для какой СУБД это? LINQ 2 Entities поддерживает несколько типов БД.

Это тоже работает...

var cust = (from c in context.Customers select c);

string sql = ((ObjectQuery)cust).ToTraceString();

С форумов MSDN

person SliverNinja - MSFT    schedule 12.02.2011
comment
@sliverNnja это для SQL 2008 R2 Express. +1 за упоминание SQL Profiler - person nobody; 12.02.2011

Используя EntityFrame 6, можно просто использовать ToString() в вашем запросе, по крайней мере, при использовании MySQL

var cust = (from c in context.Customers select c);
string sql = cust.ToString();

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

person Darryl Braaten    schedule 15.05.2015
comment
Это полезно. Он не даст вам точный sql, как Profiler, но вместо этого он будет параметризован. Но это было полезно в SQL Server, когда у меня возникла проблема с Profiler. - person Greg; 18.05.2015
comment
Entity Framework фактически возвращает вывод как Microsoft.EntityFrameworkCore.Query.Internal.EntityQueryable - person Nn Karthik; 09.08.2018

Вы можете отслеживать свой SQL при использовании Linq2Entities https://stackoverflow.com/questions/137712/sql-tracing-linq-to-entities

Вы также можете ознакомиться с этим инструментом Huagati Query Profiler.

person Shiv Kumar    schedule 12.02.2011
comment
Эта ссылка SQL, отслеживающая LINQ to Entities, больше не существует. - person CrazyPyro; 18.02.2015

Я считаю, что поток табличных данных (TDS) протокол, используемый Microsoft SQL Server, по умолчанию отправляет команды и ответы в виде обычного текста, поэтому, если вы не зашифруете соединение между вашим SQL Server и клиентом, вы должны просматривать как запрос, так и ответ с помощью комплексный анализатор пакетов.

Это потребует некоторой работы, но использование анализатора пакетов таким образом должно позволить вам увидеть, на какой T-SQL транслируется ваш LINQ.

Примечания:

  1. Я рекомендую шифровать все соединения между вашим клиентом и SQL-сервером, за исключением случаев, когда и клиент, и сервер находятся на одном компьютере, и вы выполняете разработку тестирования.
  2. Если вы не рискуете использовать расшифрованное соединение в целях тестирования, ваш анализатор пакетов может иметь подключаемый модуль, который позволит вам расшифровывать зашифрованный трафик, но я не уверен, есть ли какие-либо риски при использовании такого плагин расшифровки.
person Shawn Eary    schedule 27.08.2012

EF не имеет прямой параллели с ведением журнала на основе потоков, которое использует LINQ to SQL. Существует несколько вариантов профилирования, доступных по разным ценам. Я обсуждал некоторые из этих вариантов на странице http://www.thinqlinq.com/Post.aspx/Title/LINQ-to-Database-Performance-hints. Список этих профилировщиков и других инструментов LINQ можно найти по адресу http://www.thinqlinq.com/Post.aspx/Title/linq-tools.

person Jim Wooley    schedule 13.08.2013