Paw*_*zka 10 c# orm simple.data
我正在使用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)
Run Code Online (Sandbox Code Playgroud)
但是当添加这一行时:
.Skip((pageNumber - 1) * pageSize)
Run Code Online (Sandbox Code Playgroud)
我得到了这个例外:
无法绑定多部分标识符"dbo.CandidateProfiles.CandidateId".
我试图明确传递0,1和其他几个数字到Skip,但我总是得到相同的异常.
我的测试查询应返回4个元素,我正在跳过0个元素(在正常使用中可能更多).
附加信息:CandidateProfiles有外键Candidates,它CandidateId可以为空.
编辑:我们已经为这个问题做了一个解决方法,但我真的好奇为什么这个问题不起作用.Simple.Data起初很有趣,但现在我不确定将来是否会使用它
以下是来自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)
Run Code Online (Sandbox Code Playgroud)
由于FindAll使用完全限定名称"db.dbo.CandidateProfiles",并且每个其他引用都使用后续LeftJoin中定义的别名,因此生成的where子句中的出现不使用别名,并且最终得到一个SQL不喜欢的别名和显式表引用的混合和匹配.
我认为仅在"Skip"添加之后才发生的原因是,最终生成了非常不同的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)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
315 次 |
| 最近记录: |