MultiPOCO запрашивает сообщение об ошибке при запуске - PullRequest
1 голос
/ 03 апреля 2012

У меня есть запрос как

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);

, который выдает сообщение об ошибке:

Не удалось связать многоэлементный идентификатор «Condition.ID».Объекты «Issue» и «Issue» в предложении FROM имеют одинаковые открытые имена.Используйте имена корреляций, чтобы различать их.

Что с этим связано?

1 Ответ

2 голосов
/ 04 апреля 2012

Вы присоединяетесь к выдаче таблицы несколько раз, но никогда не используете псевдонимы.Это особенно проблема, потому что вы добавили ту же таблицу в 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.

...