NULL handling in dbcontext and objectcontext

Deadly 提交于 2019-12-10 13:08:08

问题


I have this simple LINQ query

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

Here DesignationID is a nullable field:

In objectcontext the query is translated to:

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]

While the same query in dbcontext it is translated to:

 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))

Why does objectcontext handle NULL differently than dbcontext?


回答1:


This behavior is configurable, so most likely it's a matter of a different default (I don't know why the default is different).

The control is provided by the DbContextConfiguration.UseDatabaseNullSemantics property:

Gets or sets a value indicating whether database null semantics are exhibited when comparing two operands, both of which are potentially nullable. The default value is false. For example (operand1 == operand2) will be translated as: (operand1 = operand2) if UseDatabaseNullSemantics is true, respectively (((operand1 = operand2) AND (NOT (operand1 IS NULL OR operand2 IS NULL))) OR ((operand1 IS NULL) AND (operand2 IS NULL))) if UseDatabaseNullSemantics is false.

To get the same translation as in your first example, you should set it to true (for instance inside your db context constructor):

public YourDbContext()
{
    // ...
    this.Configuration.UseDatabaseNullSemantics = true;
}


来源:https://stackoverflow.com/questions/37783677/null-handling-in-dbcontext-and-objectcontext

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!