2016-06-13 4 views
6

私はこの単純なLINQクエリNULLのdbcontextでの取り扱いとのObjectContext

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

を持ってDesignationIDはNULLフィールドです:

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

なぜobjectcontextdbcontextとは違ってNULLを処理するのですか?

答えて

3

この動作は設定可能なので、デフォルトとは異なる可能性があります(デフォルトが異なる理由はわかりません)。

制御DbContextConfiguration.UseDatabaseNullSemanticsプロパティによって提供される

は、潜在的にNULL可能であり、どちらも2つのオペランドを比較するとき、データベースヌルのセマンティクスが発揮されるかどうかを示す値を取得または設定します。 デフォルト値はfalseです。 UseDatabaseNullSemanticsがtrueの場合、それぞれ(operand1 == operand2)は、(operand1 == operand2)と解釈されます(((operand1 = operand2)AND(NOT(operand1 IS NULL OR operand2 IS NULL))))OR NULL)AND(operand2 IS NULL)))を返します。

あなたの最初の例と同じ翻訳を取得するには、(あなたのDBのコンテキストコンストラクタ内のインスタンスのために)trueに設定する必要があります

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