|
要件:EFがlinq to sqlまたはラムダ式を使用してデータベースにクエリを実行する場合、EFによって生成されたSQL文は、いくつかのIS NULLまたはIS NOT NULL条件を追加するのに役立ちます。
例
以下のSQL文が生成されます:
SELECT [Extent2].[UserStatus] AS [UserStatus], [Extent1]. [Extent1].[Id] AS [Id] FROM [dbo].[EmailInfo] AS [Extent1]. INNER JOIN [dbo]. [Account] AS [Extent2].[Account] AS [Extent2] ON ([Extent1].[Address] = [Extent2].[Eメール]) OR (([Extent1].[Address] IS NULL) AND ([Extent2].[Email] IS NULL))
例2:
以下のSQL文が生成されます:
SELECT [Extent1].[Id] AS [Id], [Extent1]. [Extent1].[Name] AS [Name], [Extent1]. [Extent1].[ParentId] AS [ParentId], [Extent1]. [Extent1].[位置] AS [位置], [Extent1]. [Extent1].[CreateTime] AS [_CreateTime], [Extent1]. [Extent1].Extent1].の[_UpdateTime] AS [_UpdateTime]. FROM [dbo].[分類] AS [Extent1]。 WHERE ([Extent1].[Name] IN (N'Android', N'Solaris')) AND ([Extent1].[Name] IS NOT NULL)
EFがこれらの余分なNULL条件を生成するのを避けたい場合は、以下を参照してください。
DbContextConfiguration.UseDatabaseNullSemantics プロパティを設定します。
両方が NULL である可能性のある 2 つのオペランドを比較するときに、データベースの NULL セマンティクスを表示するかどうかを示す値を取得または設定します。 デフォルト値は false です。
コードは以下のとおりです:
例えば UseDatabaseNullSemantics が true の場合、(operand1 == operand2) は (operand1 = operand2) に変換されます; もし UseDatabaseNullSemantics が false ならば、(((operand1 = operand2) AND (NOT (operand1 IS NULL OR operand2 IS NULL)) OR ((operand1 IS NULL) AND ((operand2)).operand2 IS NULL))。
ドキュメント(ドキュメントの紹介に誤りがあります): https://learn.microsoft.com/zh-cn/dotnet/api/system.data.entity.infrastructure.dbcontextconfiguration.usedatabasenullsemantics?view=entity-framework-6.2.0。
フィールドへの[Required]プロパティの追加
EFがオブジェクト属性に[Required]機能を追加すると、実際にその属性(フィールド)がデータベースでNULLになることを禁止し、フィールドがNULLになることを禁止するマイグレーションコマンドを実行します。 フィールドがデータベースでNULLになることが禁止されているので、EFがフィールドのために生成されるSQLステートメントでいくつかのNULLチェックを生成しないのは自然なことです。
参照: https://learn.microsoft.com/zh-cn/dotnet/api/system.componentmodel.dataannotations.requiredattribute?view=net-7.0
|
前の記事:ASP.NET Core (ゼクシィ) 設定オプション AddOptions と 設定区別次の記事:XMLHttpRequestリクエストを全てインターセプトするajax-hookのWeb開発
|