我正在使用Simple.Data 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
可以为空。
编辑:我们已经为这个问题做了一个解决方法,但我真的好奇为什么这个问题不会奏效。 Simple.Data起初看起来很有趣,但现在我不确定以后是否会使用它
答案 0 :(得分:7)
以下是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 中定义的别名,因此生成的 where 子句不使用别名,最终会得到SQL不喜欢的别名和显式表引用的混合和匹配。
我认为仅在添加“Skip”之后才发生的原因是,最终生成了非常不同的SQL(我的猜测是,只有在添加Skip之后才实际使用了别名)。 / p>
我不明白 CandidateProfiles.CandidateId == null 条件的目的(因为结合 On 调用中的条件我看不出这是怎么回事会返回任何结果),但我建议在开启调用中为连接表添加限制,以便最终在 on 子句而不是 where 子句(然后使用别名而不是完全限定名称)
.LeftJoin(db.dbo.CandidateProfiles, out alias)
.On(db.dbo.Candidates.Id == alias.CandidateId && alias.CandidateId == null)