Tsql MultiPOCO查询触发错误消息

Tsql MultiPOCO查询触发错误消息,tsql,petapoco,Tsql,Petapoco,我有一个疑问 return Connection.db.Fetch<Issue, Condition , Result , Status>( "SELECT * FROM Issue I, Condition C, Result R, Status S " + "LEFT JOIN Issue ON Condition .ID = Issue.ConditionID" + "LEFT JOIN Issue ON Result.ID = Issue.Result

我有一个疑问

return Connection.db.Fetch<Issue, Condition , Result , Status>(
    "SELECT * FROM Issue I, Condition C, Result R, Status S " +
    "LEFT JOIN Issue ON Condition .ID = Issue.ConditionID" +
    "LEFT JOIN Issue ON Result.ID = Issue.ResultID" +              
    "LEFT JOIN Issue ON Status.ID = Issue.StatusID " +
    "WHERE Issue.ID= "+ issueId);
返回Connection.db.Fetch(
“从问题I、条件C、结果R、状态S中选择*”+
“条件上的左连接问题。ID=问题。条件ID”+
“Result.ID=Issue.ResultID上的左连接问题”+
“Status.ID=Issue.StatusID上的左加入问题”+
“WHERE Issue.ID=“+issueId”);
这将发出错误消息:

无法绑定多部分标识符“Condition.ID”。 FROM子句中的对象“Issue”和“Issue”具有相同的公开名称。使用相关名称来区分它们


上面是怎么回事?

您多次加入问题表格,但绝不使用别名。这尤其是一个问题,因为您已将相同的表添加到
FROM
部分的
SELECT
子句中。在联接中始终使用别名。这是最安全的方法

所以,每当您说Issue.ID时,查询引擎都无法解析您指的是哪一个。它是从部分中的
中的还是加入
部分中的

请尝试以下代码:

return Connection.db.Fetch<Issue, Condition , Result , Status>(
    "SELECT * FROM Issue I, Condition C, Result R, Status S " +
    "LEFT JOIN Issue i1 ON C.ID = i1.ConditionID" +
    "LEFT JOIN Issue i2 ON R.ID = i2.ResultID" +              
    "LEFT JOIN Issue i3 ON S.ID = i3.StatusID " +
    "WHERE I.ID = " + issueId);
这就是前两个连接失败的主要原因。最后一个是唯一有效的,因为它可以同时看到两个表。您可能认为select生成了这些表的结果,然后按如下方式进行连接:

SELECT * FROM (Issue I, Condition C, Result R, Status S)
    LEFT JOIN ...
但事实并非如此


根据您想要的结果类型(您可能会以这样做的方式得到一个大的结果集),您必须将查询重写为另一种形式,并可能从部分中省略中的多表列表。

感谢您的回复,我仍然有一个错误,即多部分标识符“C.ID”无法绑定。无法绑定多部分标识符“P.ID”。我看不到任何P别名。您确定您遇到的问题在此查询中吗?很抱歉,我意外更改了消息…无法绑定多部分标识符“C.ID”。无法绑定多部分标识符“R.ID”。@学习:我编辑了我的答案来解释问题,但我无法为您提供解决方案,因为我不知道您实际想要什么样的结果。主要的问题是,您遇到的这个问题与PetaPoco无关,而是您的查询无效。事实上,问题在于查询。谢谢你,罗伯特
SELECT * FROM Issue I, Condition C, Result R,

    (Status S 

        LEFT JOIN Issue i1
        ON C.ID = i1.ConditionID

        LEFT JOIN Issue i2
        ON R.ID = i2.ResultID

        LEFT JOIN Issue i3
        ON S.ID = i3.StatusID 
    )

WHERE I.ID = x;
SELECT * FROM (Issue I, Condition C, Result R, Status S)
    LEFT JOIN ...