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)
我得到这个例外:
The multi-part identifier \”dbo.CandidateProfiles.CandidateId\” could
not be bound.
我试图明确地通过0,1和其他几个数字跳过,但我总是得到相同的例外.
我的测试查询应该返回4个元素,我正在跳过0个元素(它可以在正常使用中更多).
附加信息:CandidateProfiles有来自候选人的外键,它的CandidateId可以为空.
编辑:我们已经解决了这个问题,但我真的好奇为什么这个不行. Simple.Data首先看起来很有趣,但现在我不知道我将来会使用它
解决方法
Another way of getting the error is when an alias has been assigned to
a table referenced in the FROM clause of a statement and the table is
used as a prefix of a column instead of using the alias.
虽然这不是你的情况发生的情况,但是非常接近.我在代码示例中看到的问题在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)