Вы присоединяетесь к выдаче таблицы несколько раз, но никогда не используете псевдонимы.Это особенно проблема, потому что вы добавили ту же таблицу в FROM
часть вашего предложения SELECT
.Всегда используйте псевдонимы в соединениях.Это самый безопасный способ.
Поэтому, когда бы вы ни сказали, механизм запросов Issue.ID не может решить, на какой адрес вы ссылаетесь.Это к одному в FROM
части или к одному в JOIN
части.
Попробуйте этот код:
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);
И помимо этого я настоятельно рекомендую вам использовать параметры вместоконкатенации строк:
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 = @0", issueId); // see the change in this line
После некоторых размышлений это на самом деле недопустимый запрос SQL
Проблема, с которой вы столкнулись, заключается в том, что не имеет отношения к PetaPoco .Вы на самом деле написали неверный запрос SQL.Если вы выполняете этот же оператор в SSMS, вы получите ту же ошибку, и это потому, что ваш запрос интерпретируется как:
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 ...
Но это не так.
В зависимости от того, какие результаты вы хотите (выможет привести к большому результирующему набору, как вы это делаете) вам придется переписать ваш запрос в другую форму и, возможно, пропустить список из нескольких таблиц в вашей части FROM
.