我正在过滤 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/