加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

LINQ to Entities产生不正确的SQL

发布时间:2020-12-12 16:09:22 所属栏目:MsSql教程 来源:网络整理
导读:我正在过滤一个IQueryable以返回所有具有字段UserId(一个可空的int)设置为null的实体.该查询生成不正确的SQL,因此失败 – 该语句是 如下 – var filtered = certificates.Where(c = !c.UserId.HasValue).Select(c = c.SubjectName); 并且生成的SQL是 – SELEC
我正在过滤一个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定义为可选的,如果在数据库中外键是可空的.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读