Dengan penghapusan Entity Framework Core, dbData.Database.SqlQuery<SomeModel>
saya tidak dapat menemukan solusi untuk membuat SQL Query mentah untuk kueri penelusuran teks lengkap saya yang akan mengembalikan data tabel dan juga peringkatnya.
Satu-satunya metode yang saya lihat untuk membangun kueri SQL mentah di Entity Framework Core adalah melalui dbData.Product.FromSql("SQL SCRIPT");
yang tidak berguna karena saya tidak memiliki DbSet yang akan memetakan peringkat yang saya kembalikan dalam kueri.
Ada Ide ???
c#
entity-framework-core
David Harlow
sumber
sumber
Jawaban:
Itu tergantung jika Anda menggunakan EF Core 2.1 atau EF Core 3 dan versi yang lebih tinggi .
Jika Anda menggunakan EF Core 2.1
Jika Anda menggunakan EF Core 2.1 Release Candidate 1 yang tersedia sejak 7 Mei 2018, Anda dapat memanfaatkan fitur baru yang diusulkan yaitu tipe Query.
Apa itu tipe kueri ?
Kapan menggunakan tipe kueri?
Jadi, Anda tidak perlu lagi melakukan semua peretasan atau solusi yang diusulkan sebagai jawaban atas pertanyaan Anda. Ikuti saja langkah-langkah ini:
Pertama, Anda menentukan properti tipe baru di
DbQuery<T>
manaT
tipe kelas yang akan membawa nilai kolom kueri SQL Anda. Jadi di dalam diri Anda,DbContext
Anda akan memiliki ini:Kedua, gunakan
FromSql
metode seperti yang Anda lakukan denganDbSet<T>
:Perhatikan juga bahwa
DdContext
s adalah kelas parsial , sehingga Anda dapat membuat satu atau beberapa file terpisah untuk mengatur definisi 'SQL DbQuery mentah' yang paling sesuai untuk Anda.Jika Anda menggunakan EF Core 3.0 dan versi yang lebih tinggi
Jenis kueri sekarang dikenal sebagai jenis entitas tanpa kunci . Seperti yang dikatakan di atas, jenis kueri diperkenalkan di EF Core 2.1. Jika Anda menggunakan EF Core 3.0 atau versi yang lebih tinggi, Anda sekarang harus mempertimbangkan untuk menggunakan tipe tntity tanpa kunci karena tipe kueri sekarang ditandai usang.
Kami masih memiliki skenario yang sama seperti untuk tipe kueri tentang kapan harus menggunakan tipe entitas tanpa kunci.
Jadi untuk menggunakannya, Anda perlu menandai kelas Anda
SomeModel
dengan[Keyless]
anotasi data atau melalui konfigurasi yang lancar dengan.HasNoKey()
pemanggilan metode seperti di bawah ini:Setelah konfigurasi tersebut, Anda dapat menggunakan salah satu metode yang dijelaskan di sini untuk menjalankan kueri SQL Anda. Misalnya Anda bisa menggunakan yang ini:
sumber
bit
)?[NotMapped]
keSomeModels
kelas tidak bekerja untuk saya. Apakah saya melewatkan sesuatu?DbQuery
karena hanya menggunakanDbSet
dengan jenis entitas tanpa kunci .modelBuilder.Entity<MyData>().HasNoKey().ToView(null);
@ Jean-Paul Saya pikir ini menyelesaikan masalah AndaBerdasarkan jawaban lain, saya telah menulis pembantu ini yang menyelesaikan tugas, termasuk contoh penggunaan:
Pemakaian:
Saya berencana untuk menyingkirkannya segera setelah dukungan bawaan ditambahkan. Menurut pernyataan Arthur Vickers dari tim EF Core, pos 2.0 adalah prioritas tinggi. Masalahnya dilacak di sini .
sumber
Di EF Core Anda tidak lagi dapat mengeksekusi sql "gratis". Anda diminta untuk menentukan kelas POCO dan
DbSet
kelas itu. Dalam kasus Anda, Anda perlu menentukan Peringkat :Karena akan menjadi hanya-baca, akan berguna untuk menyertakan
.AsNoTracking()
panggilan tersebut.EDIT - Perubahan besar dalam EF Core 3.0:
DbQuery () sekarang sudah usang, sebagai gantinya DbSet () harus digunakan (lagi). Jika Anda memiliki entitas tanpa kunci, yaitu tidak memerlukan kunci utama, Anda dapat menggunakan metode HasNoKey () :
Informasi lebih lanjut dapat ditemukan di sini
sumber
DbContext
untuk menyertakan properti baruDbSet<Rank> Rank { get; set; }
. Implikasi apa yang akan dimilikinya sekarang sehubungan dengan LINQ? Ie Bukankah sekarang kita dapat menggunakan pernyataan sepertiDBContext.Rank.Where(i => i.key == 1)
, dan bukankah pernyataan ini tidak memiliki implementasi dalam SQL dan karena itu gagal?Anda dapat mengeksekusi sql mentah di EF Core - Tambahkan kelas ini ke proyek Anda. Ini akan memungkinkan Anda untuk mengeksekusi SQL mentah dan mendapatkan hasil mentah tanpa harus mendefinisikan POCO dan DBSet. Lihat https://github.com/aspnet/EntityFramework/issues/1862#issuecomment-220787464 untuk contoh asli.
Berikut contoh cara menggunakannya:
sumber
Untuk saat ini, sampai ada sesuatu yang baru dari EFCore saya akan menggunakan perintah dan memetakannya secara manual
Cobalah untuk SqlParameter untuk menghindari Sql Injection.
FromSql tidak berfungsi dengan kueri lengkap. Contoh jika Anda ingin memasukkan klausa WHERE maka akan diabaikan.
Beberapa Tautan:
Menjalankan Kueri SQL Mentah menggunakan Entity Framework Core
Kueri SQL Mentah
sumber
Di Core 2.1 Anda dapat melakukan sesuatu seperti ini:
lalu tentukan Prosedur SQL Anda, seperti:
Dengan cara ini model Peringkat tidak akan dibuat di DB Anda.
Sekarang di pengontrol / tindakan Anda, Anda dapat memanggil:
Dengan cara ini Anda dapat memanggil Prosedur SQL Baku.
sumber
FromSql
params bisa hanya berlalu tanpa membuatSqlParameter
objek:FromSql($"STORED_PROCEDURE {value1}, {value2}")
atauFromSql("STORED_PROCEDURE {0}, {1}", value1, value2)
(mereka akan melarikan diri).Anda dapat menggunakan ini (dari https://github.com/aspnet/EntityFrameworkCore/issues/1862#issuecomment-451671168 ):
Dan penggunaannya:
sumber
Tambahkan paket Nuget - Microsoft.EntityFrameworkCore.Relational
Ini akan mengembalikan nomor baris sebagai int
Lihat - https://docs.microsoft.com/en-us/dotnet/api/microsoft.entityframeworkcore.relationaldatabasefacadeextensions.executesqlcommand?view=efcore-3.0
sumber
coba ini: (buat metode ekstensi)
Pemakaian:
model saya: (tidak dalam
DbSet
):Catatan: solusi ini memiliki kinerja yang lambat
sumber
Tidak secara langsung menargetkan skenario OP, tetapi karena saya telah berjuang dengan ini, saya ingin melepaskan mantan ini. metode yang membuatnya lebih mudah untuk mengeksekusi SQL mentah dengan
DbContext
:sumber
Saya menggunakan Dapper untuk melewati kendala Entity framework Core ini.
bekerja dengan kueri sql atau prosedur tersimpan dengan beberapa parameter. Ngomong-ngomong, ini sedikit lebih cepat (lihat tes benchmark )
Dapper mudah dipelajari. Butuh waktu 15 menit untuk menulis dan menjalankan prosedur tersimpan dengan parameter. Bagaimanapun Anda dapat menggunakan EF dan Dapper. Berikut ini contohnya:
sumber
Anda juga dapat menggunakan QueryFirst . Seperti Dapper, ini sama sekali di luar EF. Tidak seperti Dapper (atau EF), Anda tidak perlu mempertahankan POCO, Anda mengedit SQL sql Anda di lingkungan nyata, dan terus divalidasi ulang terhadap DB. Penafian: Saya adalah penulis QueryFirst.
sumber
Kasus saya menggunakan prosedur tersimpan, bukan SQL mentah
Membuat kelas
Ditambahkan di bawah di
DbContext
kelas sayaUntuk menjalankan prosedur tersimpan:
sumber
Saya tahu ini pertanyaan lama, tapi mungkin ini membantu seseorang untuk memanggil prosedur yang tersimpan tanpa menambahkan DTO sebagai DbSets.
https://stackoverflow.com/a/62058345/3300944
sumber
Solusi ini sangat bergantung pada solusi dari @pius. Saya ingin menambahkan opsi untuk mendukung parameter kueri guna membantu mengurangi injeksi SQL dan saya juga ingin menjadikannya perpanjangan dari DbContext DatabaseFacade untuk Entity Framework Core untuk membuatnya sedikit lebih terintegrasi.
Pertama buat kelas baru dengan ekstensi:
Perhatikan di atas bahwa "T" adalah tipe untuk pengembalian dan "P" adalah jenis parameter kueri Anda yang akan bervariasi berdasarkan jika Anda menggunakan MySql, Sql, dan seterusnya.
Selanjutnya kami akan menunjukkan contoh. Saya menggunakan kemampuan MySql EF Core, jadi kita akan melihat bagaimana kita dapat menggunakan ekstensi generik di atas dengan implementasi MySql yang lebih spesifik ini:
Kueri akan mengembalikan baris seperti:
"Ford", "Explorer", "Ford Explorer"
"Tesla", "Model X", "Tesla Model X"
Judul tampilan tidak didefinisikan sebagai kolom database, jadi tidak akan menjadi bagian dari model Mobil EF secara default. Saya menyukai pendekatan ini sebagai salah satu dari banyak kemungkinan solusi. Jawaban lain di halaman ini merujuk pada cara lain untuk mengatasi masalah ini dengan dekorator [NotMapped], yang bergantung pada kasus penggunaan Anda bisa menjadi pendekatan yang lebih tepat.
Perhatikan kode dalam contoh ini jelas lebih bertele-tele daripada yang seharusnya, tetapi saya pikir itu membuat contoh lebih jelas.
sumber
Sebenarnya Anda dapat membuat repositori generik dan melakukan sesuatu seperti ini
sumber
Dengan Entity Framework 6 Anda dapat menjalankan sesuatu seperti di bawah ini
Jalankan perintah Raw DQL SQl seperti di bawah ini:
sumber