从多个表返回值时的返回类型

时间:2018-08-29 19:08:29

标签: c# ado.net

我有两个模型:

public class StudentModel
{
    public int Student_Id {get;set;}
    public string Student_Name {get;set;}
    public int Class_Id {get;set;}
}

public class ClassModel
{
    public int Class_Id {get;set;}
    public string Class_Name {get;set;}
}

我想从两个表中返回值。我的返回值应该是多少?

public ?? GetStudentClass(StageModel model)
{
    using (var connection = new SqlConnection(ConfigurationManager.ConnectionStrings["LO"].ConnectionString))
    {
        string getstudent= $"select * from student s,class c where s.classid = c.classid and s.studentid = @studentid;";
        DynamicParameters parameter = new DynamicParameters();

        parameter.Add("@studentid", model.Student_Id, DbType.Int64);

        connection.Open();

        result = connection.Execute(getstudent, parameter);
    }
}

我应该使用SQL的输出,使用定义的模型进行打印。

1 个答案:

答案 0 :(得分:0)

似乎您正在使用Dapper进行工作。但是,属性名称和数据库字段名称之间有区别。这使使用Dapper的工作更加困难,因此,我建议更改属性以匹配数据库字段中的名称。
通过此更改,您可以由Dapper自动填充课程

首先,您的StudentModel需要具有在类中声明的ClassModel的实例

public class StudentModel
{
    public int StudentId {get;set;}
    public string StudentName {get;set;}
    public int ClassId {get;set;}
    public ClassModel StudentClass {get;set;}
}

public class ClassModel
{
    public int ClassId {get;set;}
    public string ClassName {get;set;}
}

现在您以这种方式更改方法

public StudentModel GetStudent(StageModel model)
{
    using (var connection = new SqlConnection(ConfigurationManager.ConnectionStrings["LO"].ConnectionString))
    {
        string getstudent=  @"SELECT s.*, c.ClassId, c.ClassName 
                             FROM student s
                             INNER JOIN class c on s.classid = c.classid 
                             WHERE s.studentid = @studentid;";
        DynamicParameters parameter = new DynamicParameters();
        parameter.Add("@studentid", model.Student_Id, DbType.Int64);
        connection.Open();

        result = connection.Query<StudentModel, ClassModel, StudentModel>
                 (getstudent, ((s, c) => { s.ClassModel = c; return s;}), 
                 splitOn:"ClassId", parameter);

        return result;
    }
}

Dapper将为您创建 StudentModel 实例和 ClassModel 实例,并在遇到 ClassId 字段时知道如何填充这两个实例。
lambda表达式将接收Dapper创建的两个实例,您只需要在lambda接收到的StudentModel中设置ClassModel即可。

此方法遵循您的问题所给人的印象,即学生和班级之间存在1:1的关系。当然,如果关系为1:N,并且在 StudentModel

中需要一个 List ,问题就更复杂了。