c# – Simple.Data ORM.多部分标识符无法绑定

前端之家收集整理的这篇文章主要介绍了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)

我得到这个例外:

The multi-part identifier \”dbo.CandidateProfiles.CandidateId\” could
not be bound.

我试图明确地通过0,1和其他几个数字跳过,但我总是得到相同的例外.

我的测试查询应该返回4个元素,我正在跳过0个元素(它可以在正常使用中更多).

附加信息:CandidateProfiles有来自候选人的外键,它的CandidateId可以为空.

编辑:我们已经解决了这个问题,但我真的好奇为什么这个不行. Simple.Data首先看起来很有趣,但现在我不知道我将来会使用它

解决方法

以下是从 http://www.sql-server-helper.com/error-messages/msg-4104.aspx sql语句的解释:

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)

猜你在找的C#相关文章