Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Mengapa EF menghasilkan kueri SQL dengan pemeriksaan nol yang tidak perlu?

Setel UseDatabaseNullSemantics = true;

  • Ketika UseDatabaseNullSemantics == true , (operand1 == operand2) akan diterjemahkan sebagai:

    WHERE operand1 = operand2
    
  • Ketika UseDatabaseNullSemantics == false , (operand1 == operand2) akan diterjemahkan sebagai:

    WHERE
        (
            (operand1 = operand2)
            AND
            (NOT (operand1 IS NULL OR operand2 IS NULL))
        )
        OR
        (
            (operand1 IS NULL)
            AND
            (operand2 IS NULL)
        )
    

Ini didokumentasikan oleh Microsoft:

Mendapat atau menetapkan nilai yang menunjukkan apakah semantik nol basis data ditampilkan saat membandingkan dua operan, yang keduanya berpotensi nullable. Nilai defaultnya salah.

Anda dapat mengaturnya di DbContext konstruktor subkelas, seperti:

public class MyContext : DbContext
{
    public MyContext()
    {
        this.Configuration.UseDatabaseNullSemantics = true;
    }
}

Atau Anda juga dapat mengatur pengaturan ini ke dbContext contoh dari luar seperti contoh kode di bawah ini, dari sudut pandang saya (lihat komentar @GertArnold), pendekatan ini akan lebih baik, karena tidak akan mengubah perilaku atau konfigurasi database default):

myDbContext.Configuration.UseDatabaseNullSemantics = true;


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL Server CTE dan contoh rekursi

  2. Menyimpan dan Menganalisis Dokumen di Sistem File Windows dengan Pencarian Semantik SQL Server – Bagian 2

  3. Kapan performa Distinct dan Group By berbeda?

  4. Membuat nama tabel yang merupakan kata/kata kunci yang dicadangkan di MS SQL Server

  5. OPENJSON "Sintaks salah di dekat kata kunci 'dengan'." di SQL Server (ASK)