Jak wyświetlić kod SQL wygenerowany przez strukturę encji?
(W moim szczególnym przypadku korzystam z dostawcy mysql - jeśli to ma znaczenie)
Jak wyświetlić kod SQL wygenerowany przez strukturę encji?
(W moim szczególnym przypadku korzystam z dostawcy mysql - jeśli to ma znaczenie)
Odpowiedzi:
Możesz wykonać następujące czynności:
lub w EF6:
To da ci wygenerowany SQL.
źródło
.Single()
twojego obiektu już nie maIQueryable
.result
doSystem.Data.Entity.Infrastructure.DbQuery<T>
, a następnie uzyskać własność wewnętrznąInternalQuery
jak(System.Data.Entity.Internal.Linq.InternalQuery<T>)
i tylko wtedy, zastosowanieToTraceString()
result.ToString()
Dla tych, którzy używają Entity Framework 6 i nowszych, jeśli chcesz wyświetlić wyjściowy SQL w Visual Studio (tak jak ja), musisz użyć nowej funkcji rejestrowania / przechwytywania.
Dodanie następującego wiersza wypluje wygenerowany kod SQL (wraz z dodatkowymi szczegółami związanymi z wykonaniem) w panelu wyjściowym programu Visual Studio:
Więcej informacji o logowaniu EF6 w tej fajnej serii blogów: http://blog.oneunicorn.com/2013/05/08/ef6-sql-logging-part-1-simple-logging/
Uwaga: Upewnij się, że projekt jest uruchomiony w trybie DEBUG.
źródło
Począwszy od wersji EF6.1, można użyć przechwytywaczy do zarejestrowania rejestratora bazy danych. Zobacz rozdziały „Przechwytywacze” i „Rejestrowanie operacji na bazie danych” w pliku tutaj
źródło
Jeśli używasz DbContext, możesz wykonać następujące czynności, aby uzyskać SQL:
źródło
ToString()
poda zapytanie ze zmiennymi, np.p__linq__0
zamiast wartości końcowych (np .: 34563 zamiastp__linq__0
)Dotyczy EF 6.0 i nowszych: dla tych, którzy chcą dowiedzieć się więcej o funkcji rejestrowania i dodać do niektórych już udzielonych odpowiedzi.
Każde polecenie wysłane z EF do bazy danych może być teraz zarejestrowane. Aby wyświetlić wygenerowane zapytania z EF 6.x, użyj
DBContext.Database.Log property
Co zostanie zarejestrowane?
Przykład:
Wynik:
Aby zalogować się do pliku zewnętrznego:
Więcej informacji tutaj: Rejestrowanie i przechwytywanie operacji na bazie danych
źródło
W EF 4.1 możesz wykonać następujące czynności:
To da ci wygenerowany SQL.
źródło
ToString()
wynikiem jest przestrzeń nazw tego typu niestandardowego. Na przykład, jeśli powyższy kodselect new CustomType { x = x.Name }
byłby, zwrócona wartość byłaby podobnaCompany.Models.CustomType
do wygenerowanego kodu SQL.System.Data.Objects.ObjectQuery``1[MyProject.Models.Product]
dla mnie.Moja odpowiedź dotyczy rdzenia EF . Odnoszę się do tego problemu z github i dokumentów dotyczących konfiguracji
DbContext
:Prosty
Przesłoń
OnConfiguring
metodę swojejDbContext
klasy (YourCustomDbContext
) jak pokazano tutaj, aby użyć ConsoleLoggerProvider; twoje zapytania powinny zalogować się do konsoli:Złożony
Kompleks ten przypadek unika przesłanianie się
DbContext
OnConfiguring
metodę., co jest odradzane w dokumentach: „Takie podejście nie nadaje się do testowania, chyba że testy są ukierunkowane na pełną bazę danych”.W tym złożonym przypadku zastosowano:
IServiceCollection
wStartup
klasieConfigureServices
(zamiast przesłonięciaOnConfiguring
metody; zaletą jest luźniejsze połączenie międzyDbContext
iILoggerProvider
którego chcesz użyć)ILoggerProvider
(zamiast korzystania zConsoleLoggerProvider
implementacji pokazanej powyżej; korzyścią jest to, że nasza implementacja pokazuje, w jaki sposób logujemy się do pliku (nie widzę dostawcy rejestrowania plików dostarczanego z EF Core ))Lubię to:
Oto implementacja a
MyLoggerProvider
(MyLogger
która dołącza swoje dzienniki do pliku, który możesz skonfigurować; twoje zapytania EF Core pojawią się w pliku).źródło
Istnieją dwa sposoby:
ToTraceString()
. Możesz dodać go do okna zegarka i ustawić punkt przerwania, aby zobaczyć, jakie zapytanie będzie w danym momencie dla dowolnego zapytania LINQ.tail -f
. Możesz dowiedzieć się więcej o funkcjach logowania MySQL w oficjalnej dokumentacji . W przypadku programu SQL Server najprostszym sposobem jest użycie dołączonego narzędzia do profilowania programu SQL Server.źródło
Aby zapytanie było zawsze pod ręką, bez zmiany kodu, dodaj to do DbContext i sprawdź w oknie wyników w Visual Studio.
Podobnie do odpowiedzi @Matt Nibecker, ale dzięki temu nie musisz dodawać jej do bieżącego kodu za każdym razem, gdy potrzebujesz zapytania.
źródło
SQL Management Studio => Narzędzia => SQL Server profiler
Plik => Nowy ślad ...
Użyj szablonu => puste
Wybór zdarzenia => T-SQL
Sprawdź po lewej stronie: SP.StmtComplete
Filtrów kolumnowych można użyć do wybrania konkretnej nazwy aplikacji lub bazy danych
Uruchom ten profil, a następnie uruchom zapytanie.
Kliknij tutaj, aby uzyskać informacje o źródle
źródło
W tej chwili używam do tego celu Express profilera, wadą jest to, że działa tylko dla MS SQL Server. Możesz znaleźć to narzędzie tutaj: https://expressprofiler.codeplex.com/
źródło
Zwróci zapytanie SQL. Praca z wykorzystaniem tekstu danych EntityFramework 6
źródło
Microsoft.EntityFrameworkCore.Query.Internal.EntityQueryable
wykrywa obiekt: 1 [System.Linq.IGrouping2[System.Int32,String]]
zamiast rzeczywistego zapytania. Czy coś przeoczyłem, czy zapomniałeś o czymś wspomnieć?Robię test integracji i potrzebowałem tego do debugowania wygenerowanej instrukcji SQL w Entity Framework Core 2.1, więc używam
DebugLoggerProvider
lubConsoleLoggerProvider
lubię tak:Oto przykładowe dane wyjściowe z konsoli Visual Studio:
źródło
Nekromancja.
Ta strona jest pierwszym wynikiem wyszukiwania podczas wyszukiwania rozwiązania dla dowolnej platformy .NET Framework, więc tutaj jako usługa publiczna, jak to się robi w EntityFramework Core (dla .NET Core 1 i 2):
A następnie te metody rozszerzeń (IQueryableExtensions1 dla .NET Core 1.0, IQueryableExtensions dla .NET Core 2.0):
źródło
var modelVisitor = (RelationalQueryModelVisitor) queryCompilationContext.CreateQueryModelVisitor();
W moim przypadku dla EF 6+, zamiast używać tego w Natychmiastowym oknie, aby znaleźć ciąg zapytania:
Skończyło się na tym, aby uzyskać wygenerowane polecenie SQL:
Oczywiście twój anonimowy podpis może się różnić.
HTH.
źródło
Właśnie to zrobiłem:
Wynik pokazany w danych wyjściowych :
źródło
Dla mnie, używając EF6 i Visual Studio 2015, wszedłem
query
do bezpośredniego okna i dało mi to wygenerowaną instrukcję SQLźródło
Jeśli chcesz także mieć wartości parametrów (nie tylko,
@p_linq_0
ale także ich wartości), możesz użyćIDbCommandInterceptor
i dodać trochę logowania doReaderExecuted
metody.źródło
Chociaż są tutaj dobre odpowiedzi, żadne nie rozwiązało mojego problemu całkowicie (chciałem uzyskać całą instrukcję SQL, w tym parametry , z DbContext z dowolnego IQueryable. Poniższy kod właśnie to robi. Jest to kombinacja fragmentów kodu od Google. I przetestowałem to tylko z EF6 + .
Na marginesie, to zadanie zajęło mi znacznie dłużej, niż się spodziewałem. Abstrakcja w Entity Framework to trochę dużo, IMHO.
Najpierw za pomocą. Będziesz potrzebował wyraźnego odwołania do „System.Data.Entity.dll”.
Następująca klasa przekształca IQueryable w DataTable. Zmodyfikuj w zależności od potrzeb:
Aby użyć, po prostu nazwij to jak poniżej:
źródło
Rozwiązanie Entity Framework 4
Większość odpowiedzi tutaj dotyczyła EF6. Oto jeden z tych, którzy nadal używają EF4.
Ta metoda zastępuje
@p__linq__0
/ etc. parametry z ich rzeczywistymi wartościami, więc możesz po prostu skopiować i wkleić dane wyjściowe do SSMS i uruchomić je lub debugować.źródło