LINQ to Entities产生不正确的SQL

前端之家收集整理的这篇文章主要介绍了LINQ to Entities产生不正确的SQL前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在过滤一个IQueryable以返回所有具有字段UserId(一个可空的int)设置为null的实体.该查询生成不正确的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

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定义为可选的,如果在数据库中外键是可空的.

猜你在找的MsSQL相关文章