dbcontext和objectcontext中的NULL处理

我有这个简单的LINQ查询

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

这里的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] 

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

为什么objectcontext不同于dbcontext处理NULL?

这种行为是可配置的,所以很可能是一个不同的默认值(我不知道为什么默认值不同)。

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

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

要获得与第一个示例中相同的转换,应将其设置为true (例如,在db上下文构造函数中):

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