gpt4 book ai didi

LINQ to Entities 生成不正确的 SQL

转载 作者:行者123 更新时间:2023-12-03 07:30:50 26 4
gpt4 key购买 nike

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com