Saya ingin menjalankan kueri seperti ini
var result = from entry in table
where entry.something == null
select entry;
dan dapatkan IS NULL
.
Diedit: Setelah dua jawaban pertama saya merasa perlu mengklarifikasi bahwa saya menggunakan Entity Framework dan bukan Linq ke SQL. Metode object.Equals () tampaknya tidak berfungsi di EF.
Edit no.2: Kueri di atas berfungsi sebagaimana mestinya. Ini menghasilkan dengan benar IS NULL
. Namun kode produksi saya adalah
value = null;
var result = from entry in table
where entry.something == value
select entry;
dan SQL yang dihasilkan adalah something = @p; @p = NULL
. Tampaknya EF menerjemahkan ekspresi konstan dengan benar tetapi jika sebuah variabel terlibat, itu memperlakukannya seperti perbandingan normal. Sebenarnya masuk akal. Saya akan menutup pertanyaan ini
.net
entity-framework
ado.net
Adrian Zanescu
sumber
sumber
Jawaban:
Solusi untuk Linq-to-SQL:
Solusi untuk Linq-ke-Entitas (aduh!):
Ini adalah serangga jahat yang telah menggigit saya beberapa kali.
Jika bug ini juga memengaruhi Anda, kunjungi laporan bug di UserVoice dan beri tahu Microsoft bahwa bug ini juga memengaruhi Anda.Sunting: Bug ini sedang diperbaiki di EF 4.5 ! Terima kasih semuanya telah meningkatkan bug ini!
Untuk kompatibilitas mundur, itu akan diikutsertakan - Anda perlu mengaktifkan pengaturan secara manual agar
entry == value
berfungsi. Belum ada kabar tentang apa pengaturan ini. Tetap disini!Sunting 2: Menurut posting ini oleh tim EF, masalah ini telah diperbaiki di EF6! Woo hoo!
Ini berarti bahwa kode yang ada yang bergantung pada perilaku lama (
null != null
, tetapi hanya ketika membandingkan dengan variabel) perlu diubah untuk tidak bergantung pada perilaku itu, atau disetelUseCSharpNullComparisonBehavior
ke false untuk menggunakan perilaku lama yang rusak.sumber
(var result = from ...; if(value.HasValue) result = result.Where(e => e.something == value) else result = result.Where(e => e.something == null);
(where Object.Equals(entry.something,value))
Sejak Entity Framework 5.0 Anda dapat menggunakan kode berikut untuk menyelesaikan masalah Anda:
Ini seharusnya menyelesaikan masalah Anda karena Entity Framerwork akan menggunakan perbandingan nol 'C # like'.
sumber
Ada solusi yang sedikit lebih sederhana yang berfungsi dengan LINQ ke Entitas:
Ini berfungsi karena, seperti yang diperhatikan AZ, LINQ ke kasus khusus Entitas x == null (yaitu perbandingan kesetaraan terhadap konstanta null) dan menerjemahkannya ke x IS NULL.
Saat ini kami sedang mempertimbangkan untuk mengubah perilaku ini untuk memperkenalkan perbandingan kompensasi secara otomatis jika kedua sisi persamaan dapat dinihilkan. Namun ada beberapa tantangan:
Bagaimanapun, apakah kita dapat mengerjakan ini akan sangat bergantung pada prioritas relatif yang diberikan pelanggan kita padanya. Jika Anda peduli dengan masalah ini, saya mendorong Anda untuk memilihnya di situs Saran Fitur baru kami: https://data.uservoice.com .
sumber
Jika itu adalah tipe nullable, mungkin coba gunakan properti HasValue?
Tidak ada EF untuk diuji di sini ... hanya saran =)
sumber
== null
tidak terkena bug. Intinya adalah memfilter berdasarkan nilai variabel, yang nilainya mungkin nol, dan memiliki nilai nol menemukan catatan nol.(x => x.Column == null)
dapat berfungsi. :)System.NullReferenceException
, karena objek allready adalah null!Referensi MSDN : LINQ ke SQL: Query Terintegrasi Bahasa .NET untuk Data Relasional
sumber
untuk menangani penggunaan Null Comparisons,
Object.Equals()
bukan==
periksa referensi ini
sumber
null
,Object.Equals(null)
, bagaimana jikaObject
itu sendiri adalah null?Menunjukkan bahwa semua Entity Framework <6.0 saran menghasilkan beberapa SQL yang canggung. Lihat contoh kedua untuk perbaikan "bersih".
Solusi Konyol
menghasilkan SQL seperti:
Solusi yang Memalukan
Jika Anda ingin menghasilkan SQL yang lebih bersih, sesuatu seperti:
menghasilkan apa yang Anda inginkan di tempat pertama:
sumber
Kueri di atas berfungsi sebagaimana mestinya. Ini dengan benar menghasilkan IS NULL. Namun kode produksi saya adalah
dan SQL yang dihasilkan adalah sesuatu = @p; @p = NULL. Tampaknya EF menerjemahkan ekspresi konstan dengan benar tetapi jika sebuah variabel terlibat, itu memperlakukannya seperti perbandingan normal. Sebenarnya masuk akal.
sumber
Tampaknya Linq2Sql juga memiliki "masalah" ini. Tampaknya ada alasan yang sah untuk perilaku ini karena apakah ANSI NULL AKTIF atau NONAKTIF tetapi membingungkan pikiran mengapa "== null" yang lurus sebenarnya akan berfungsi seperti yang Anda harapkan.
sumber
Secara pribadi, saya lebih suka:
lebih
karena mencegah pengulangan - meskipun secara matematis tidak tepat, tetapi cocok untuk kebanyakan kasus.
sumber
Saya tidak dapat mengomentari posting divega, tetapi di antara berbagai solusi yang disajikan di sini, solusi divega menghasilkan SQL terbaik. Baik kinerja bijaksana maupun panjang. Saya baru saja memeriksa dengan SQL Server Profiler dan dengan melihat rencana eksekusi (dengan "SET STATISTICS PROFILE ON").
sumber
Sayangnya di Entity Framework 5 DbContext masalah ini masih belum diperbaiki.
Saya menggunakan solusi ini (bekerja dengan MSSQL 2012 tetapi pengaturan ANSI NULLS mungkin tidak berlaku lagi di versi MSSQL di masa mendatang).
Perlu dicatat bahwa ini adalah solusi yang kotor tetapi dapat diterapkan dengan sangat cepat dan berfungsi untuk semua kueri.
sumber
Jika Anda lebih suka menggunakan sintaks metode (lambda) seperti yang saya lakukan, Anda dapat melakukan hal yang sama seperti ini:
sumber
gunakan itu
sumber