2016-06-13 13 views
6

Ich habe diese einfache LINQ-AbfrageNULL Handhabung in DbContext und Object

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

Hier DesignationID ein Nullable-Feld ist:

In objectcontext die Abfrage übersetzt:

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] 

Während die gleiche Abfrage in dbcontext wird übersetzt in:

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

Warum behandelt objectcontext NULL anders als dbcontext?

Antwort

3

Dieses Verhalten ist konfigurierbar, daher ist es höchstwahrscheinlich eine andere Vorgabe (ich weiß nicht, warum der Standardwert anders ist).

Die Steuerung wird durch die DbContextConfiguration.UseDatabaseNullSemantics Gelände:

Ruft einen Wert ab, der angibt, ob Datenbank null Semantik ausgestellt werden, wenn zwei Operanden zu vergleichen, von denen beide potentiell nullable sind. Der Standardwert ist false. Zum Beispiel (operand1 == operand2) wird wie folgt übersetzt: (operand1 = operand2) wenn UseDatabaseNullSemantics wahr ist (((operand1 = operand2) AND (NOT (operand1 IST NULL ODER operand2 IST NULL))) ODER ((operand1 IS NULL) UND (operand2 ist NULL))) wenn UseDatabaseNullSemantics false ist.

Um die gleiche Übersetzung wie in Ihrem ersten Beispiel zu erhalten, können Sie es zu true (zum Beispiel in Ihrem db Kontext Konstruktor) setzen sollen

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