Link to Entities: вижте получената заявка (context.Log = Console.Out)

Току-що разбрах, че ако вашето C# приложение използва 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 поддържа множество типове DB.

Това също работи...

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 към 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