简单.数据ORM.无法绑定多部分标识符
本文关键字:多部 标识符 绑定 数据 ORM 简单 | 更新日期: 2023-09-27 18:03:26
我用的是Simple。数据ORM。我正试图从两个连接表进行查询。这个查询可以正常工作:
dynamic alias;
var candidatesRec = db.dbo.Candidates
.FindAll(db.dbo.Candidates.CommonOfferId == commonOfferId
&& db.dbo.CandidateProfiles.CandidateId == null)
.LeftJoin(db.dbo.CandidateProfiles, out alias)
.On(db.dbo.Candidates.Id == alias.CandidateId)
.Select(
db.dbo.Candidates.Id,
db.dbo.Candidates.Email
)
.OrderByDescending(db.dbo.Candidates.ApplicationDate)
但是当添加这一行时:
.Skip((pageNumber - 1) * pageSize)
我得到了这个异常:
多部分标识符"dbo.CandidateProfiles"。CandidateId '"可能不受约束
我试图显式地传递0,1和其他几个数字给Skip,但我总是得到相同的异常。
我的测试查询应该返回4个元素,我跳过0个元素(它可以在正常使用中更多)。
附加信息:CandidateProfiles
有Candidates
的外键,CandidateId
可以为空。
下面是对来自http://www.sql-server-helper.com/error-messages/msg-4104.aspx:
的SQL错误的解释另一种获得错误的方式是当分配了别名时在语句的FROM子句中引用的表,该表是用作列的前缀,而不是使用别名。
虽然这与你的情况不完全一样,但它非常接近。我看到的问题与您的代码示例是在FindAll调用:
.FindAll(db.dbo.Candidates.CommonOfferId == commonOfferId
&& db.dbo.CandidateProfiles.CandidateId == null)
.LeftJoin(db.dbo.CandidateProfiles, out alias)
由于FindAll使用的是完全限定名"db.dbo "。CandidateProfiles"和所有其他引用都使用在后续的LeftJoin中定义的别名,生成的中子句不使用别名的情况,您最终会得到别名和显式表引用的混合和匹配,SQL不喜欢。
我认为它只发生在你的情况下"跳过"被添加后的原因,是非常不同的SQL最终被生成(我的猜测是,只有在Skip被添加是一个别名实际使用)。
我不明白CandidateProfiles的目的。CandidateId == null条件(因为与On调用中的条件相结合,我看不出这将如何返回任何结果),但我建议在On调用中对连接表添加限制,以便它最终出现在On子句中,而不是where子句中(然后使用别名而不是完全限定名)
.LeftJoin(db.dbo.CandidateProfiles, out alias)
.On(db.dbo.Candidates.Id == alias.CandidateId && alias.CandidateId == null)