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

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起初很有趣,但现在我不确定将来是否会使用它

Dav*_*der 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)
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)