2016-06-13 23 views
6

Tôi có điều này truy vấn LINQ đơn giảnxử lý NULL trong dbcontext và ObjectContext

from e in Employees 
where e.DesignationID !=558 
select e 

Đây DesignationID là một lĩnh vực nullable:

Trong objectcontext truy vấn được phiên dịch sang:

SELECT 
[Extent1].[EmployeeID] AS [EmployeeID], 
[Extent1].[EmployeeCode] AS [EmployeeCode], 
[Extent1].[EmployeeName] AS [EmployeeName], 
[Extent1].[DesignationID] AS [DesignationID] 
FROM [dbo].[setupEmployees] AS [Extent1] 
WHERE 558 <> [Extent1].[DesignationID] 

Trong khi cùng một truy vấn trong dbcontext nó được dịch sang:

SELECT 
    [Extent1].[EmployeeID] AS [EmployeeID], 
    [Extent1].[EmployeeCode] AS [EmployeeCode], 
    [Extent1].[EmployeeName] AS [EmployeeName], 
    [Extent1].[DesignationID] AS [DesignationID] 
    FROM [dbo].[setupEmployees] AS [Extent1] 
WHERE NOT ((558 = [Extent1].[DesignationID]) AND ([Extent1].[DesignationID] IS NOT NULL)) 

Tại sao objectcontext xử lý NULL khác với dbcontext?

Trả lời

3

Hành vi này có thể định cấu hình, vì vậy rất có thể đó là vấn đề của một mặc định khác (tôi không biết tại sao mặc định là khác nhau).

Việc kiểm soát được cung cấp bởi DbContextConfiguration.UseDatabaseNullSemantics tài sản:

Gets hoặc thiết lập một giá trị nêu rõ cơ sở dữ liệu ngữ nghĩa vô được trưng bày khi so sánh hai toán hạng, cả hai đều là có khả năng nullable. Giá trị mặc định là false. Ví dụ (operand1 == operand2) sẽ được dịch là: (operand1 = operand2) nếu UseDatabaseNullSemantics là đúng, tương ứng (((operand1 = operand2) AND (NOT (operand1 IS NULL HOẶC operand2 IS NULL))) OR ((operand1 IS) NULL) AND (operand2 IS NULL))) nếu UseDatabaseNullSemantics là sai.

Để có được bản dịch tương tự như trong ví dụ đầu tiên của bạn, bạn nên đặt nó vào true (ví dụ bên trong constructor bối cảnh db của bạn):

public YourDbContext() 
{ 
    // ... 
    this.Configuration.UseDatabaseNullSemantics = true; 
} 
Các vấn đề liên quan