流利的Nhibernate加入三个表

时间:2015-06-09 07:40:08

标签: c# join fluent-nhibernate

我在我的C#应用​​程序中使用FluentNhibernate我想知道如何连接三个没有定义外键的表。让我们假设我有以下表结构,

学生[StudentID,Name1,Name2,ClassID]

班级[ClassID,姓名,学校ID]

学校[SchoolID,SchoolName]

我需要加入以上三个表格

SELECT a.Name1,a.Name2,b.Name,c.SchoolName FROM Student a, Class b, School c WHERE a.ClassID = b.ClassID AND b.SchoolID = c.SchoolID

我做了表映射并按如下方式执行查询

public class Student
    {
        public virtual int StudentID     { get; set; }
        public virtual string Name1      { get; set; }
        public virtual string ClassID     { get; set; }
        public virtual string ClsName     { get; set; }
        public virtual string SchoolName  { get; set; }

    }


    public class StudentMap : ClassMap<Student>
    {
       public StudentMap()
        {
            Id(x => x.StudentID).Column("student_id");
            Map(x => x.Name1).Column("name_1");
            Map(x => x.ClassID).Column("ClassId");
            Join("class", join =>
            {
               join.KeyColumn("class_id");
                Join("school", J =>
                {
                    J.Map(m => m.SchoolName, "school_Name");
                    J.KeyColumn("school_Id");
                });
            });
            Table("student");
        }
    }

//执行查询

var studnt = session.CreateCriteria<Student>("st").List<Student>();

但是,它总是返回一个对象(行),有人知道如何通过连接上面的三个表来获取行列表吗?

1 个答案:

答案 0 :(得分:0)

更改您编写的查询,如下所示。

        string sqlCommand= @"SELECT 
            a.Id StudentId,
            a.Name1 StudentName,
            a.Name2 StudentName2,
            b.Name ClassName,
            c.SchoolName SchoolName 
                FROM Student a, Class b, School c 
                    WHERE a.ClassID = b.ClassID AND b.SchoolID = c.SchoolID";


public class StudentInfo
{
    int StudentId { get; set; }
    string StudentName { get; set; }
    string StudentName2 { get; set; }
    string ClassName { get; set; }
    string SchoolName { get; set; }
}

        List<StudentInfo> studentInfoList = new List<StudentInfo>();
        studentInfoList = session.CreateSQLQuery(sqlCommand)
            .AddScalar("StudentId", NHibernateUtil.Int32)
            .AddScalar("StudentName", NHibernateUtil.String)
            .AddScalar("StudentName2", NHibernateUtil.String)
            .AddScalar("ClassName", NHibernateUtil.String)
            .AddScalar("SchoolName", NHibernateUtil.String)
            .SetResultTransformer(NHibernate.Transform.Transformers.AliasToBean<StudentInfo>())
            .List<StudentInfo>().ToList();