私は、フィールド UserId (null 許容の int) が null に設定されているすべてのエンティティを返すように IQueryable をフィルタリングしています。クエリは誤った SQL を生成するため失敗します。ステートメントは次のようになります。
var filtered = certificates.Where(c => !c.UserId.HasValue).Select(c => c.SubjectName);
生成されたSQLは次のようになります。
SELECT
CAST(NULL AS varchar(1)) AS [C1],
CAST(NULL AS int) AS [C2],
CAST(NULL AS datetime2) AS [C3],
CAST(NULL AS datetime2) AS [C4],
CAST(NULL AS bit) AS [C5],
CAST(NULL AS datetime2) AS [C6],
CAST(NULL AS int) AS [C7]
FROM ( SELECT 1 AS X ) AS [SingleRowTable1]
WHERE 1 = 0
一体何が起こっているのか、何か分かりますか? 考え方は単純で、UserId フィールドが false であるすべての行を返したいだけです。UserId は null 可能で、クエリ対象のテーブルには記述された条件に一致する 3 つの行がありますが、LINQ クエリは 0 を返します。
ありがとう!
ベストアンサー1
これはEFが知っている場合に生成するクエリの種類です確かにクエリは結果を返しません。このようなクエリはデータベース処理を最小限に抑えます。
EF はなぜそんなに確信できるのでしょうか? これは、データベースが null 可能でないことがわかっている場合にのみ可能です。これは、必要に応じてマップされた参照 (POCO クラス) がUserId
ある場合に限り可能です。次のようなものを探します。User
Certificate
HasRequired(t => t.User).WithMany(t => t.Certificates)
内、または内EntityTypeConfiguration<Certificate>
の のオーバーライド内。(コードファーストでは、付随するプリミティブ Id プロパティが null 許容型であるにもかかわらず、必須の参照を持つことが可能です。edmx ファイルでは、これは検証されません)。OnModelCreating
DbContext
User
したがって、データベース内の外部キーが null 可能である場合は、オプションとしてマップする必要があると思います。