Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Tại sao EF lại tạo ra các truy vấn SQL với các lần kiểm tra null không cần thiết?

Đặt UseDatabaseNullSemantics = true;

  • Khi UseDatabaseNullSemantics == true , (operand1 == operand2) sẽ được dịch là:

    WHERE operand1 = operand2
    
  • Khi UseDatabaseNullSemantics == false , (operand1 == operand2) sẽ được dịch là:

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

Đây là tài liệu của Microsoft:

Nhận hoặc đặt một giá trị cho biết ngữ nghĩa null của cơ sở dữ liệu có được hiển thị hay không khi so sánh hai toán hạng, cả hai đều có khả năng là null. Giá trị mặc định là false.

Bạn có thể đặt nó trong DbContext của mình phương thức khởi tạo lớp con, giống như vậy:

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

Hoặc bạn cũng có thể đặt cài đặt này thành dbContext của bạn ví dụ từ bên ngoài như ví dụ mã bên dưới, theo quan điểm của tôi (xem nhận xét của @GertArnold), apporach này sẽ tốt hơn, vì nó sẽ không thay đổi cấu hình hoặc hành vi cơ sở dữ liệu mặc định):

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. Các xu hướng trong năm 2020 mà các DBA nên biết

  2. Cách áp dụng Mệnh đề Có với Nhóm bằng trong Truy vấn Chọn - Hướng dẫn SQL Server / TSQL Phần 131

  3. Toán tử ký hiệu và (&) trong mệnh đề WHERE của SQL Server

  4. Truyền tham số chuỗi xml vào thủ tục được lưu trữ trên SQL Server

  5. Các chức năng SQL Server đơn giản để giải quyết các vấn đề trong thế giới thực