Ini bukan perbandingan peka huruf besar kecil di LINQ dengan Entitas:
Thingies.First(t => t.Name == "ThingamaBob");
Bagaimana cara saya mencapai perbandingan case sensitive dengan LINQ ke Entitas?
c#
.net
entity-framework-4
linq-to-entities
Ronnie Overby
sumber
sumber
Jawaban:
Itu karena Anda menggunakan LINQ To Entities yang pada akhirnya mengubah ekspresi Lambda Anda menjadi pernyataan SQL. Itu berarti sensitivitas huruf besar / kecil berada di tangan SQL Server Anda yang secara default memiliki Penyusunan SQL_Latin1_General_CP1_CI_AS dan TIDAK peka huruf besar / kecil.
Menggunakan ObjectQuery.ToTraceString untuk melihat kueri SQL yang dihasilkan yang sebenarnya telah dikirim ke SQL Server mengungkap misteri:
Saat Anda membuat kueri LINQ ke Entitas , LINQ ke Entitas memanfaatkan pengurai LINQ untuk mulai memproses kueri dan mengubahnya menjadi pohon ekspresi LINQ. Pohon ekspresi LINQ kemudian diteruskan ke Object Services API, yang mengubah pohon ekspresi menjadi pohon perintah. Ini kemudian dikirim ke penyedia penyimpanan (misalnya SqlClient), yang mengubah pohon perintah menjadi teks perintah database asli. Query dieksekusi di penyimpanan data dan hasilnya direalisasikan menjadi Objek Entitas oleh Object Services. Tidak ada logika yang dimasukkan untuk mempertimbangkan sensitivitas huruf. Jadi, apa pun kasus yang Anda masukkan ke dalam predikat, itu akan selalu diperlakukan sama oleh SQL Server Anda kecuali jika Anda mengubah SQL Server Collates untuk kolom itu.
Solusi sisi server:
Oleh karena itu, solusi terbaik adalah dengan mengubah pemeriksaan dari Nama kolom di thingies meja ke Collate Latin1_General_CS_AS yang case sensitive dengan menjalankan ini pada SQL Server Anda:
Untuk informasi selengkapnya tentang SQL Server Collates , lihat SQL SERVER Collate Case Sensitive SQL Query Search
Solusi sisi klien:
Satu-satunya solusi yang dapat Anda terapkan di sisi klien adalah dengan menggunakan LINQ ke Objek untuk melakukan perbandingan lain yang tampaknya tidak terlalu elegan:
sumber
Anda dapat menambahkan anotasi [CaseSensitive] untuk EF6 + Code-first
Tambahkan kelas ini
Ubah DbContext Anda, tambahkan
Lalu lakukan
Add-Migration CaseSensitive
Perbarui-Database
berdasarkan artikel https://milinaudara.wordpress.com/2015/02/04/case-sensitive-search-using-entity-framework-with-custom-annotation/ dengan beberapa perbaikan bug
sumber
WHERE
kondisi di SQL Server tidak membedakan huruf besar / kecil secara default. Buat peka huruf besar kecil dengan mengubah susunan default kolom (SQL_Latin1_General_CP1_CI_AS
) menjadiSQL_Latin1_General_CP1_CS_AS
.Cara yang rapuh untuk melakukannya adalah dengan kode. Tambahkan file migrasi baru dan kemudian tambahkan ini di dalam
Up
metode:Tapi
Anda dapat membuat anotasi khusus yang disebut "CaseSensitive" menggunakan fitur EF6 yang baru dan Anda dapat menghias properti Anda seperti ini:
Posting blog ini menjelaskan bagaimana melakukan itu.
sumber
Jawaban yang diberikan oleh @Morteza Manavi menyelesaikan masalah tersebut. Namun, untuk solusi sisi klien , cara yang elegan adalah sebagai berikut (menambahkan tanda centang ganda).
sumber
Saya menyukai jawaban Morteza, dan biasanya lebih suka memperbaiki di sisi server. Untuk sisi klien saya biasanya menggunakan:
Pada dasarnya, pertama-tama periksa apakah ada pengguna dengan kriteria yang disyaratkan, lalu periksa apakah kata sandinya sama. Agak bertele-tele, tetapi saya merasa lebih mudah untuk membaca ketika mungkin ada banyak kriteria yang terlibat.
sumber
Tak satu pun dari yang
StringComparison.IgnoreCase
berhasil untuk saya. Tapi ini berhasil:sumber
How can I achieve case sensitive comparison
Gunakan string. Sama
Selain itu, Anda tidak perlu khawatir tentang null dan hanya mendapatkan kembali informasi yang Anda inginkan.
Gunakan StringComparision.CurrentCultureIgnoreCase untuk Case Insensitive.
sumber
Tidak yakin tentang EF4, tetapi EF5 mendukung ini:
sumber
StringComparison
enum ini atau yang lainnya untuk membuat perbedaan. Saya telah melihat cukup banyak orang yang menyarankan hal semacam ini harus bekerja untuk berpikir masalahnya ada di suatu tempat di file EDMX (db-first), meskipun stackoverflow.com/questions/841226/…