我在查询带有Devart DotConnect for PostgreSQL连接器的Entity Framework实体的null字段时发现了一个奇怪的行为。
例如:如果我进行了以下两项测试:
var test1 = context.blocs.Where(x => x.id_bloc == null); var test2 = context.blocs.Where(x => x.id_bloc == 100);
检查EF自动生成的SQL查询时,我获得以下结果:
test1的结果:
{SELECT CAST(NULL AS int) AS "C1", CAST(NULL AS varchar) AS "C2", CAST(NULL AS varchar) AS "C3", CAST(NULL AS varchar) AS "C4" FROM ( SELECT 1 AS X) AS "SingleRowTable1" WHERE true = false}
test2的结果:
{SELECT "Extent1".id_bloc, "Extent1".numero, "Extent1".nom, "Extent1".titre FROM "role".bloc AS "Extent1" WHERE "Extent1".id_bloc = 100}
查询空字段时的结果非常奇怪......我期待的结果类似于测试2的结果但是带有"Extent1".id_bloc IS NULL
WHERE子句......
这是一个错误吗?如何有效地查询空字段?
答案 0 :(得分:1)
是否使用Entity Key属性定义了id_bloc属性?如果是,则正确生成结果SQL。
实体密钥无法为空,这就是为什么实体框架避免对表的不必要请求:生成假SQL,它提供相同的空结果集但不占用服务器资源。
您可以使用SQL Server检查行为(通过System.Data.SqlClient) - 它必须相同。