Bagaimana cara melihat SQL yang dihasilkan oleh kerangka kerja entitas?
(Dalam kasus khusus saya, saya menggunakan penyedia mysql - jika itu penting)
entity-framework
ado.net
tidak
sumber
sumber
Jawaban:
Anda dapat melakukan hal berikut:
atau di EF6:
Itu akan memberi Anda SQL yang dihasilkan.
sumber
.Single()
objek Anda tidak lagiIQueryable
saya kira.result
keSystem.Data.Entity.Infrastructure.DbQuery<T>
, kemudian mendapatkan properti internalInternalQuery
sebagai(System.Data.Entity.Internal.Linq.InternalQuery<T>)
, dan hanya pada saat itu, gunakanToTraceString()
result.ToString()
Bagi mereka yang menggunakan Entity Framework 6 dan lebih tinggi, jika Anda ingin melihat output SQL dalam Visual Studio (seperti yang saya lakukan), Anda harus menggunakan fungsi logging / intersepsi yang baru.
Menambahkan baris berikut akan memuntahkan SQL yang dihasilkan (bersama dengan detail terkait eksekusi tambahan) di panel output Visual Studio:
Informasi lebih lanjut tentang masuk dalam EF6 dalam seri blog yang bagus ini: http://blog.oneunicorn.com/2013/05/08/ef6-sql-logging-part-1-simple-logging/
Catatan: Pastikan Anda menjalankan proyek Anda dalam mode DEBUG.
sumber
Dimulai dengan EF6.1 Anda dapat menggunakan Interceptors untuk mendaftarkan logger basis data. Lihat bab "Pencegat" dan "Operasi Database Pencatatan" ke File di sini
sumber
Jika Anda menggunakan DbContext, Anda dapat melakukan hal berikut untuk mendapatkan SQL:
sumber
ToString()
akan memberi Anda kueri dengan variabel di dalamnya, sepertip__linq__0
, alih-alih nilai akhir (misal: 34563 alih-alihp__linq__0
)Berlaku untuk EF 6.0 ke atas: Bagi Anda yang ingin tahu lebih banyak tentang fungsionalitas pencatatan dan menambahkan ke beberapa jawaban yang sudah diberikan.
Perintah apa pun yang dikirim dari EF ke database sekarang dapat dicatat. Untuk melihat pertanyaan yang dihasilkan dari EF 6.x, gunakan
DBContext.Database.Log property
Apa yang Mendapat Log
Contoh:
Keluaran:
Untuk masuk ke file eksternal:
Info lebih lanjut di sini: Logging dan Mencegah Operasi Database
sumber
Anda dapat melakukan hal berikut di EF 4.1:
Itu akan memberi Anda SQL yang dihasilkan.
sumber
ToString()
output adalah namespace dari tipe kustom itu. Sebagai contoh, jika kode di atas adalahselect new CustomType { x = x.Name }
, nilai yang dikembalikan akan menjadi sepertiCompany.Models.CustomType
bukannya SQL yang dihasilkan.System.Data.Objects.ObjectQuery``1[MyProject.Models.Product]
bagi saya.Jawaban saya membahas inti EF . Saya merujuk masalah github ini , dan dokumen tentang konfigurasi
DbContext
:Sederhana
Ganti
OnConfiguring
metodeDbContext
kelas Anda (YourCustomDbContext
) seperti yang ditunjukkan di sini untuk menggunakan ConsoleLoggerProvider; pertanyaan Anda harus masuk ke konsol:Kompleks
Kasus Kompleks ini menghindari override yang
DbContext
OnConfiguring
metode. , yang tidak disarankan dalam dokumen: "Pendekatan ini tidak cocok untuk pengujian, kecuali jika tes menargetkan basis data lengkap."Kasing Kompleks ini menggunakan:
IServiceCollection
inStartup
classConfigureServices
(alih-alih menggantiOnConfiguring
metode; manfaatnya adalah kopling yang lebih longgar antaraDbContext
dan yangILoggerProvider
ingin Anda gunakan)ILoggerProvider
(alih-alih menggunakanConsoleLoggerProvider
implementasi yang ditunjukkan di atas; manfaat adalah implementasi kami yang menunjukkan bagaimana kami akan masuk ke File (Saya tidak melihat Penyedia Logging File dikirimkan bersama EF Core ))Seperti ini:
Inilah implementasi dari a
MyLoggerProvider
(danMyLogger
yang menambahkan log-nya ke File yang dapat Anda konfigurasikan; kueri EF Core Anda akan muncul dalam file.)sumber
Ada dua cara:
ToTraceString()
. Anda bisa menambahkannya ke jendela arloji Anda dan mengatur titik istirahat untuk melihat seperti apa kueri pada titik tertentu untuk setiap kueri LINQ.tail -f
. Anda dapat mempelajari lebih lanjut tentang fasilitas logging MySQL di dokumentasi resmi . Untuk SQL Server, cara termudah adalah dengan menggunakan profiler SQL Server yang disertakan.sumber
Agar kueri selalu praktis, tanpa mengubah kode, tambahkan ini ke DbContext Anda dan periksa di jendela output di visual studio.
Mirip dengan @Matt Nibecker, tetapi dengan ini Anda tidak perlu menambahkannya dalam kode Anda saat ini, setiap kali Anda membutuhkan kueri.
sumber
SQL Management Studio => Tools => SQL Server profiler
File => Jejak Baru ...
Gunakan Template => Kosong
Pilihan acara => T-SQL
Lefthandside memeriksa: SP.StmtComplete
Filter kolom dapat digunakan untuk memilih ApplicationName atau DatabaseName tertentu
Mulai menjalankan profil itu kemudian memicu permintaan.
Klik di sini untuk informasi Sumber
sumber
Yah, saya menggunakan profiler Express untuk tujuan itu saat ini, kekurangannya adalah itu hanya bekerja untuk MS SQL Server. Anda dapat menemukan alat ini di sini: https://expressprofiler.codeplex.com/
sumber
Akan mengembalikan kueri sql. Bekerja menggunakan datacontext dari EntityFramework 6
sumber
Microsoft.EntityFrameworkCore.Query.Internal.EntityQueryable
1 [System.Linq.IGrouping2[System.Int32,String]]
bukan permintaan yang sebenarnya. Apakah saya kehilangan sesuatu atau Anda lupa menyebutkan sesuatu?Saya sedang melakukan tes integrasi, dan perlu ini untuk men-debug pernyataan SQL yang dihasilkan di Entity Framework Core 2.1, jadi saya menggunakan
DebugLoggerProvider
atauConsoleLoggerProvider
seperti itu:Berikut ini contoh keluaran dari konsol Visual Studio:
sumber
Necromancing.
Halaman ini adalah hasil pencarian pertama ketika mencari solusi untuk .NET Framework, jadi di sini sebagai layanan publik, bagaimana hal itu dilakukan dalam EntityFramework Core (untuk .NET Core 1 & 2):
Dan kemudian metode ekstensi ini (IQueryableExtensions1 untuk .NET Core 1.0, IQueryableExtensions untuk .NET Core 2.0):
sumber
var modelVisitor = (RelationalQueryModelVisitor) queryCompilationContext.CreateQueryModelVisitor();
Dalam kasus saya untuk EF 6+, alih-alih menggunakan ini di Jendela Segera untuk menemukan string kueri:
Saya akhirnya harus menggunakan ini untuk mendapatkan perintah SQL yang dihasilkan:
Tentu saja tanda tangan jenis anonim Anda mungkin berbeda.
HTH.
sumber
Saya baru saja melakukan ini:
Dan hasilnya ditunjukkan pada Output :
sumber
Bagi saya, menggunakan EF6 dan Visual Studio 2015 saya masuk
query
di jendela langsung dan itu memberi saya Pernyataan SQL yang dihasilkansumber
Jika Anda ingin memiliki nilai parameter (tidak hanya
@p_linq_0
tetapi juga nilainya), Anda dapat menggunakanIDbCommandInterceptor
dan menambahkan beberapa logging keReaderExecuted
metode.sumber
Walaupun ada jawaban yang baik di sini, tidak ada yang menyelesaikan masalah saya sepenuhnya (saya ingin mendapatkan seluruh pernyataan SQL, termasuk Parameter , dari DbContext dari IQueryable. Kode berikut tidak hanya itu. Ini adalah kombinasi dari potongan kode dari Google. Saya hanya mengujinya dengan EF6 + .
Di samping itu, tugas ini membawa saya jauh lebih lama daripada yang saya kira. Abstraksi dalam Entity Framework sedikit banyak, IMHO.
Pertama menggunakan. Anda akan memerlukan referensi eksplisit ke 'System.Data.Entity.dll'.
Kelas berikut mengubah IQueryable menjadi DataTable. Ubah sesuai kebutuhan Anda mungkin:
Untuk menggunakannya, cukup sebut sebagai berikut:
sumber
Solusi Entity Framework 4
Sebagian besar jawaban di sini adalah khusus EF6. Ini satu untuk Anda yang masih menggunakan EF4.
Metode ini menggantikan
@p__linq__0
/ etc. parameter dengan nilai aktualnya, jadi Anda bisa menyalin dan menempelkan output ke SSMS dan menjalankannya atau men-debug-nya.sumber