简单.数据ORM.无法绑定多部分标识符

本文关键字:多部 标识符 绑定 数据 ORM 简单 | 更新日期: 2023-09-27 18:03:26

我用的是Simple。数据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个元素(它可以在正常使用中更多)。

附加信息:CandidateProfilesCandidates的外键,CandidateId可以为空。

编辑:我们已经为这个问题做了一个变通办法,但我真的很好奇为什么这个办法行不通。简单。Data一开始看起来很有趣,但现在我不确定我将来是否会使用它

简单.数据ORM.无法绑定多部分标识符

下面是对来自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中定义的别名,生成的子句不使用别名的情况,您最终会得到别名和显式表引用的混合和匹配,SQL不喜欢。

我认为它只发生在你的情况下"跳过"被添加后的原因,是非常不同的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)