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定义为可选的,如果在数据库中外键是可空的. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |