dbcontext和objectcontext中的NULL处理

Tas*_*que 6 c# linq entity-framework objectcontext dbcontext

我有这个简单的LINQ查询

from e in Employees 
where e.DesignationID !=558
select e
Run Code Online (Sandbox Code Playgroud)

DesignationID是一个可以为空的字段:

objectcontext查询中被翻译为:

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]
Run Code Online (Sandbox Code Playgroud)

虽然其中的相同查询dbcontext被翻译为:

 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))
Run Code Online (Sandbox Code Playgroud)

为什么objectcontext处理NULL不同于dbcontext

Iva*_*oev 3

此行为是可配置的,因此很可能是不同默认值的问题(我不知道为什么默认值不同)。

该控件由DbContextConfiguration.UseDatabaseNullSemantics属性提供:

获取或设置一个值,该值指示在比较两个操作数(这两个操作数都可能为空)时是否显示数据库空语义。默认值为 false。例如 (operand1 == operand2) 将被翻译为: (operand1 = operand2) 如果 UseDatabaseNullSemantics 为 true,则分别 (((operand1 = operand2) AND (NOT (operand1 IS NULL OR operand2 IS NULL))) OR ((operand1 IS NULL) AND (operand2 IS NULL))) 如果 UseDatabaseNullSemantics 为 false。

要获得与第一个示例相同的翻译,您应该将其设置为true(例如在数据库上下文构造函数中):

public YourDbContext()
{
    // ...
    this.Configuration.UseDatabaseNullSemantics = true;
}
Run Code Online (Sandbox Code Playgroud)