0

我正在使用具有以下内容的 petapoco 关系扩展:

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; }
    }
4

2 回答 2

1

假设有一个 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

于 2012-03-09T09:23:33.330 回答
1

尝试这个。它指定第二个对象的键以及第一个对象的键。

还要注意参数的使用,而不是将其连接到您的 sql 字符串中。这不会给你一个错误,但出于各种原因,最好这样做。

编辑

我刚刚注意到您实际上并没有加入 sql 中的 UserProject 表。这就是为什么你得到上面的第一个错误。你真的是说像下面这样的吗?

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

更新

根据您上面的课程,您缺少一些东西。我假设您在 Projects 和 UserProjects 之间具有一对多的关系(似乎 UserProject 可能是 Projects 和 Users 之间的多对多关系中的桥接表)。该FetchOneToMany方法的目的是获取关系的“多”端,并将所有这些对象放入关系“单”端的列表属性中。

所以,你应该在你的 Project 类上有一个List<UserProject>类型的属性,以便它工作。

public class Project
{
    public int ID { get; set; }
    public string Name { get; set; }
    public List<UserProject> UserProjects { get; set; }
}
于 2012-03-08T17:31:54.980 回答