我正在过滤一个IQueryable以返回所有具有字段UserId(一个可空的int)设置为null的实体.该查询生成不正确的sql,因此失败 – 该语句是
如下 –
如下 –
var filtered = certificates.Where(c => !c.UserId.HasValue).Select(c => c.SubjectName);
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
WTF有什么想法吗?这个想法很简单,我只想返回UserId为false的所有行. UserId为空,正在查询的表具有与所描述的条件相匹配的三行,但LINQ查询返回0.
谢谢!
解决方法
这是EF产生的那种查询,当它确定查询不会返回任何结果.这样的查询使数据库处理最小化.
EF如何确定?这只能在所有它知道数据库中的UserId不可为空.反过来,这只能是在证书(POCO类)中也有需要映射的用户引用的时候.寻找类似的东西
Hasrequired(t => t.User).WithMany(t => t.Certificates)
在EntityTypeConfiguration< Certificate>中,或者在DbContext中覆盖OnModelCreating. (在代码优先的情况下,可以有一个必需的引用,而伴随的原始Id属性是可空的类型,在一个edmx文件中,这不能验证).
所以我认为你必须将User定义为可选的,如果在数据库中外键是可空的.