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

时间:2015-07-20 07:28:20

标签: 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)

但是当添加这一行时:

.Skip((pageNumber - 1) * pageSize)

我得到了这个例外:

  

多部分标识符\" dbo.CandidateProfiles.CandidateId \"可以   不受束缚。

我试图明确地将0,1和其他几个数字传递给Skip,但我总是得到同样的例外。

我的测试查询应返回4个元素,并且我跳过0个元素(在正常使用中可能更多)。

其他信息:CandidateProfiles包含来自Candidates的外键,其CandidateId可以为空。

编辑:我们已经为这个问题做了一个解决方法,但我真的好奇为什么这个问题不会奏效。 Simple.Data起初看起来很有趣,但现在我不确定以后是否会使用它

1 个答案:

答案 0 :(得分: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)

由于 FindAll 使用完全限定名称“db.dbo.CandidateProfiles”,并且所有其他引用都使用后续 LeftJoin 中定义的别名,因此生成的 where 子句不使用别名,最终会得到SQL不喜欢的别名和显式表引用的混合和匹配。

我认为仅在添加“Skip”之后才发生的原因是,最终生成了非常不同的SQL(我的猜测是,只有在添加Skip之后才实际使用了别名)。 / p>

我不明白 CandidateProfiles.CandidateId == null 条件的目的(因为结合 On 调用中的条件我看不出这是怎么回事会返回任何结果),但我建议在开启调用中为连接表添加限制,以便最终在 on 子句而不是 where 子句(然后使用别名而不是完全限定名称)

.LeftJoin(db.dbo.CandidateProfiles, out alias)  
.On(db.dbo.Candidates.Id == alias.CandidateId && alias.CandidateId == null)