c# – Simple.Data ORM.多部分标识符无法绑定
我正在使用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) 我得到这个例外:
我试图明确地通过0,1和其他几个数字跳过,但我总是得到相同的例外. 我的测试查询应该返回4个元素,我正在跳过0个元素(它可以在正常使用中更多). 附加信息:CandidateProfiles有来自候选人的外键,它的CandidateId可以为空. 编辑:我们已经解决了这个问题,但我真的好奇为什么这个不行. Simple.Data首先看起来很有趣,但现在我不知道我将来会使用它 解决方法
以下是从
http://www.sql-server-helper.com/error-messages/msg-4104.aspx SQL语句的解释:
虽然这不是你的情况发生的情况,但是非常接近.我在代码示例中看到的问题在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不喜欢. 我认为只有在“跳过”之后才发生这种情况的原因是,最终生成了非常不同的SQL(我的猜测是,只有在添加了“跳过”之后,实际使用了别名). 我不明白CandidateProfiles.CandidateId == null条件的目的(因为结合在On调用中的条件我看不到这将返回任何结果),但我建议添加限制到连接的表在On调用中,使它最终在on子句而不是where子句(然后使用别名而不是完全限定名) .LeftJoin(db.dbo.CandidateProfiles,out alias) .On(db.dbo.Candidates.Id == alias.CandidateId && alias.CandidateId == null) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |