Kami mencoba mengimplementasikan operator "LIKE" di Entity Framework untuk entitas kami dengan bidang string, tetapi tampaknya tidak didukung. Adakah orang lain yang mencoba melakukan hal seperti ini?
Entri blog ini merangkum masalah yang kami alami. Kita bisa menggunakan berisi, tapi itu hanya cocok dengan kasus paling sepele untuk LIKE. Menggabungkan contains, startswith, endswith, dan indexof membawa kita ke sana, tetapi membutuhkan terjemahan antara wildcard standar dan kode Linq ke Entitas.
Jawaban:
Ini adalah posting lama sekarang, tetapi bagi siapa pun yang mencari jawabannya, tautan ini akan membantu. Lanjutkan ke jawaban ini jika Anda sudah menggunakan EF 6.2.x. Untuk jawaban ini jika Anda menggunakan EF Core 2.x
Versi pendek:
SqlFunctions.PatIndexMetode - mengembalikan posisi awal kemunculan pertama pola dalam ekspresi yang ditentukan, atau nol jika pola tidak ditemukan, pada semua tipe data teks dan karakter yang valid
Namespace: System.Data.Objects.SqlClient Assembly: System.Data.Entity (dalam System.Data.Entity.dll)
Sedikit penjelasan juga muncul di utas forum ini .
sumber
Saya tidak tahu apa-apa tentang EF, tetapi dalam LINQ ke SQL Anda biasanya mengekspresikan klausa LIKE menggunakan String. Berisi:
diterjemahkan menjadi
(Gunakan
StartsWith
danEndsWith
untuk perilaku lainnya.)Saya tidak sepenuhnya yakin apakah itu membantu, karena saya tidak mengerti apa yang Anda maksud ketika Anda mengatakan Anda mencoba menerapkan LIKE. Jika saya benar-benar salah paham, beri tahu saya dan saya akan menghapus jawaban ini :)
sumber
Saya memiliki masalah yang sama.
Untuk saat ini, saya telah menyelesaikan pemfilteran Wildcard / Regex sisi klien berdasarkan http://www.codeproject.com/Articles/11556/Converting-Wildcards-to-Regexes?msg=1423024#xx1423024xx - sederhana dan berfungsi sebagai diharapkan.
Saya telah menemukan diskusi lain tentang topik ini: http://forums.asp.net/t/1654093.aspx/2/10
Posting ini terlihat menjanjikan jika Anda menggunakan Entity Framework> = 4.0:
Catatan: solusi ini hanya untuk SQL-Server, karena menggunakan fungsi PATINDEX non-standar.
sumber
Pembaruan: Di EF 6.2 ada operator sejenis
sumber
Where(obj => DbFunctions.Like(obj.Column , "%expression%")
?Ada
LIKE
operator yang ditambahkan diEntity Framework Core 2.0
:var query = from e in _context.Employees where EF.Functions.Like(e.Title, "%developer%") select e;
Membandingkannya
... where e.Title.Contains("developer") ...
benar-benar diterjemahkan keSQL
LIKE
daripadaCHARINDEX
kita melihatContains
metode.sumber
Ini secara khusus disebutkan dalam dokumentasi sebagai bagian dari Entity SQL. Apakah Anda mendapatkan pesan kesalahan?
// LIKE and ESCAPE // If an AdventureWorksEntities.Product contained a Name // with the value 'Down_Tube', the following query would find that // value. Select value P.Name FROM AdventureWorksEntities.Product as P where P.Name LIKE 'DownA_%' ESCAPE 'A' // LIKE Select value P.Name FROM AdventureWorksEntities.Product as P where P.Name like 'BB%'
http://msdn.microsoft.com/en-us/library/bb399359.aspx
sumber
jika Anda menggunakan MS Sql, saya telah menulis 2 metode ekstensi untuk mendukung karakter% untuk pencarian wildcard. (LinqKit diperlukan)
pemakaian
di ef6 dan itu harus diterjemahkan ke
', @ p__linq__0 ='% He% llo% ', @ p__linq__1 ='% Hi% ', @ p__linq_2 ='% Aktif '
sumber
Untuk EfCore, berikut adalah contoh untuk membangun ekspresi LIKE
sumber
Anda dapat menggunakan real like di Tautkan ke Entitas dengan cukup mudah
Menambahkan
ke EDMX Anda di tag ini:
Ingat juga namespace di
<schema namespace="" />
atributKemudian tambahkan kelas ekstensi di namespace di atas:
Metode ekstensi ini sekarang akan dipetakan ke fungsi EDMX.
Info lebih lanjut di sini: http://jendaperl.blogspot.be/2011/02/like-in-linq-to-entities.html
sumber