Привязать данные из SQL к объектам, имеющим ссылку на другой класс - PullRequest
0 голосов
/ 09 мая 2018

У меня есть следующий класс:

    public class Student : StudentInfo
    {
        public School School { get; set; }
    }

    public abstract class School
    {
        public string SchoolName { get; set; }

        public string SchoolAddress { get; set; }
    }

    public abstract class StudentInfo
    {
        public string StudentName { get; set; }

        public string StudentAge { get; set; }

        public string StudentGender { get; set; }

        public Relationship StudentRelationship { get; set; }
    }

    public abstract class Relationship
    {
        public string StudentMotherName { get; set; }

        public string StudentFatherName { get; set; }
    }

И у меня есть следующий запрос SQL, который возвращает все необходимые данные и готов к связыванию с классами выше, я делаю это следующим образом:

    private List<Student> StudentList()
    {
        var students = new List<Student>();

        using (var conn = new SqlConnection(ConfigurationManager.ConnectionStrings["Connection"].ConnectionString))
        {
            conn.Open();

            string query = "SELECT a.[StudentName], a.[StudentAge], a.[StudentGender], a.[StudentMotherName], a.[StudentFatherName], b.[SchoolName], b.[SchoolAddress]
FROM [Student] a WITH (NOLOCK) INNER JOIN [School] b WITH (NOLOCK) ON a.[StudentID] = b.[StudentID]";

            using (var cmd = new SqlCommand(query, conn))
            {
                using (var reader = cmd.ExecuteReader())
                {
                    while (reader.Read())
                    {
                        students.Add
                        (
                            new Student
                            {
                                StudentName = reader["StudentName"].ToString(),
                                StudentAge = reader["StudentAge"].ToString(),
                                StudentGender = reader["StudentGender"].ToString()
                            }
                        );
                    }
                }
            }
        }

        return students;
    }

Я запутался в том, как связать объекты в StudentInfo и School и Relationship class, так как я просто создаю экземпляр класса Student.

Любая помощь будет высоко ценится.

Спасибо

Ответы [ 2 ]

0 голосов
/ 09 мая 2018

Ответа, предоставленного @ cricket_007, должно быть достаточно для вашего случая, но кажется, что вы не знакомы с ORM. Поэтому я хотел бы добавить еще несколько деталей -

Во-первых, , вы можете самостоятельно запустить сырой SQL и создать граф объектов самостоятельно. Пример уже приведен в ответе.

Во-вторых , если вам нужно смешать оба типа, запустив необработанный SQL самостоятельно, но не хотите самостоятельно генерировать граф объектов или отображать их. Вы можете использовать Dapper . Вот простой пример для dapper - http://dapper -tutorial.net /

В-третьих , если вы хотите выполнить полное сопоставление объектов и не хотите самостоятельно писать необработанный SQL, попробуйте entityframework или NHibernate (очень старый, EF более новый). Ссылки -

EF: http://www.entityframeworktutorial.net/code-first/simple-code-first-example.aspx

NHibernate: http://nhibernate.info/doc/tutorials/first-nh-app/your-first-nhibernate-based-application

0 голосов
/ 09 мая 2018

Вам нужны два других объекта, чтобы построить ученика

Следуйте шаблону, подобному этому

while (reader.Read()) {
    // initialize temp objects for each row 
    var s = new Student();
    var rel = new Relationship();
    var school = new School();

    // Extract database values
    s.StudentName = reader["StudentName"].ToString();
    s.StudentAge = reader["StudentAge"].ToString();
    s.StudentGender = reader["StudentGender"].ToString();
    // TODO: load other variables 

    // add object to list 
    students.Add(s);
 }

(помните, что вы не можете создать новый абстрактный класс)

Я бы посоветовал проверить, подходит ли какая-либо библиотека ORM для ваших нужд разработки, хотя

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...