2016-06-13 2 views
6

У меня есть этот простой, запросов LINQобработка NULL в DbContext и ObjectContext

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 ручка NULL отличается от dbcontext?

ответ

3

Это поведение настраивается, поэтому, скорее всего, это вопрос другого значения по умолчанию (я не знаю, почему значение по умолчанию отличается).

управления обеспечивается DbContextConfiguration.UseDatabaseNullSemantics свойства:

Получает или задает значение, указывающее, является ли нуль семантика базы данных экспонируются при сравнении двух операндов, оба из которых являются потенциально обнуляемыми. Значение по умолчанию - false. Например, (operand1 == operand2) будет переведен как: (operand1 = operand2), если UseDatabaseNullSemantics является истинным, соответственно (((operand1 = operand2) AND (NOT (операнд1 IS NULL ИЛИ операнд2 IS NULL))) ИЛИ ((операнд1 IS NULL) AND (операнд2 IS NULL))), если UseDatabaseNullSemantics является ложным.

Чтобы получить тот же перевод, как и в первом примере, вы должны установить его в true (например, внутри дб контекста конструктора):

public YourDbContext() 
{ 
    // ... 
    this.Configuration.UseDatabaseNullSemantics = true; 
} 
Смежные вопросы