Сообщение об ошибке, состоящее из нескольких частей, не может быть связано petapoco

Я использую petapoco RelationsExtensions со следующим:

Connection.db.FetchOneToMany<Project, UserProject>(x=>x.ID, string.Format(@"
            SELECT * 
            FROM Project                         
            WHERE project.id = userProject.ProjectID
                AND userProject.UserID =" + userID + 
                 " ORDER BY project.Name" )); 

но со следующей ошибкой.

 > The multi-part identifier "userProject.ProjectID" could not be bound. The multi-part identifier "userProject.UserID" could not be bound.

Что случилось? Я что-то упустил?

Определение класса проекта

    private int id;
        public  int ID
        {
            get { return id; }
            set { id = value; }
        }
        private string name;
 public string Name
        {
            get { return name; }
            set { name = value; }
        }

Определение класса UserProject

int id;
    int userId;
           int projectId;
 public int ID
    {
        get { return id; }
        set { id = value; }
    }
 public int UserID
    {
        get { return userId; }
        set { userId = value; }
    }
 public int ProjectID
    {
        get { return projectId; }
        set { projectId = value; }
    }

person learning    schedule 08.03.2012    source источник
comment
Вам нужно присоединиться к таблице пользовательских проектов?   -  person Typo Johnson    schedule 09.03.2012
comment
@Гарет, да, мне нужно к ним присоединиться   -  person learning    schedule 09.03.2012


Ответы (2)


Предполагая, что есть таблица UserProject; ошибка является ошибкой SQL, потому что вы не присоединяетесь к таблице UserProject и не ссылаетесь на нее в sql. Попробуй это :

Connection.db.FetchOneToMany<Project, UserProject>(x=>x.ID, string.Format(@"
            SELECT * 
            FROM Project                   
            left join userproject on userProject.ProjectID = project.id
                where userProject.UserID =" + userID + 
                 " ORDER BY project.Name" )); 

Расширения отношений не меняют ваш sql

person Typo Johnson    schedule 09.03.2012
comment
Также вы должны использовать здесь параметры sql, чтобы предотвратить внедрение sql. например; ....где userProject.UserID=@0 ORDER BY project.Name, userID)); - person Typo Johnson; 09.03.2012
comment
Спасибо, Гарет, это очень полезно. - person learning; 13.03.2012

Попробуй это. Он указывает ключ второго объекта так же, как и первый.

Обратите также внимание на использование параметров, а не их объединение в строку sql. Это не даст вам ошибки, но лучше сделать так по целому ряду причин.

Изменить

Я только что заметил, что вы на самом деле не присоединяетесь к таблице UserProject в своем sql. Вот почему вы получили первую ошибку выше. Вы действительно имели в виду что-то вроде ниже?

var projects = Connection.db.FetchOneToMany<Project, UserProject>(
               x => x.ID, 
               "SELECT * 
               FROM Project
               LEFT JOIN UserProject ON project.id = userProject.ProjectID                        
               WHERE userProject.UserID = @0 
               ORDER BY project.Name", userID);

Обновить

Основываясь на ваших классах выше, вы что-то упускаете. Я предполагаю, что у вас есть отношения «один ко многим» между проектами и пользовательскими проектами (похоже, что UserProject может быть таблицей-мостом в отношениях «многие ко многим» между проектами и пользователями). Цель метода FetchOneToMany состоит в том, чтобы взять сторону отношения «многие» и поместить все эти объекты в свойство списка на стороне отношения «один».

Таким образом, у вас должно быть свойство в вашем классе Project, которое имеет тип List<UserProject>, чтобы это работало.

public class Project
{
    public int ID { get; set; }
    public string Name { get; set; }
    public List<UserProject> UserProjects { get; set; }
}
person patmortech    schedule 08.03.2012
comment
У меня появляется сообщение об ошибке Ошибка 1 Невозможно преобразовать лямбда-выражение в тип «строка», потому что это не тип делегата - person learning; 09.03.2012
comment
Смотрите мою правку. Только что понял, что ваш оператор sql на самом деле не присоединился к таблице userproject, что объясняет вашу первую ошибку и может быть связано со второй. - person patmortech; 09.03.2012
comment
спасибо за ответ. Я пытаюсь сделать что-то как ВЫБЕРИТЕ проект ИЗ проекта КАК проекта, UserProject AS userProject WHERE project.id = userProject.Project.id AND userProject.User.id = {0} ORDER BY project.Name, userID). Я думаю, что не понял, как использовать ratioExtensions, и попробовал приведенный выше код. Это может дать вам намек на то, что я хочу сделать. - person learning; 09.03.2012
comment
Можете ли вы показать определения классов Project и UserProject (отредактируйте свой вопрос)? - person patmortech; 09.03.2012
comment
Я вставил определение классов в отредактированную часть вопроса. - person learning; 09.03.2012
comment
Последняя вещь. Я понимаю, почему вы могли получить эту другую ошибку (теперь, когда я вижу ваши классы). Я ошибочно указал projectId в качестве второго ключа, но теперь я вижу, что UserProject также имеет свойство ID. Поскольку это одно и то же имя, вы можете указать его только один раз. Смотрите мою правку. - person patmortech; 09.03.2012
comment
Спасибо @patmortech, это было так полезно. - person learning; 13.03.2012