LINQ to Entities 生成不正确的 SQL

标签 linq entity-framework null

我正在过滤 IQueryable 以返回将字段 UserId(可为空的 int)设置为空的所有实体。查询生成了不正确的 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在数据库中不可为空。反过来,这只能在还有 User 时出现。引用 Certificate (POCO 类)根据需要进行映射。寻找类似的东西

HasRequired(t => t.User).WithMany(t => t.Certificates)

EntityTypeConfiguration<Certificate> ,或覆盖 OnModelCreating在您的 DbContext . (在 code-first 中可能有一个必需的引用,而伴随的原始 Id 属性是一个可空类型。在 edmx 文件中,这不会验证)。

所以我认为你必须映射 User如果在数据库中外键可以为空,则作为可选。

关于LINQ to Entities 生成不正确的 SQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18967692/

相关文章:

c# - 仅当对象不为 null 时,如何将属性的值分配给 var

c# - 基于条件的 Linq to SQL OrderBy 和 ThenBy

c# - 在所有列表项中搜索特定的重复值和非重复值

linq - 使用 LINQ 动态映射(或构造投影)

entity-framework - TFS 中未包含 Entity Framework 5 POCO?

c++ - 不初始化指针和将其初始化为空有什么区别?

c# - LINQ join 语句问题

entity-framework - Entity Framework Power Tools Beta 3 在尝试生成 View 时抛出异常 "sequence contains no matching element"

database - NHibernate 或 EF,Shards 还是手动分片?

c - (char*) 0 是什么意思?