Kết nối

Kết nối nhiều bảng bằng join trong LINQ

39.808 lượt xem 
 Cập nhật lần cuối: 13/09/2023 lúc 10:40:47
Thể loại: LINQ 

Các bảng trong cơ sở dữ liệu luôn có mối quan hệ lẫn nhau khi phân tích để tối ưu dữ liệu, khi đó bạn phải thường xuyên phải truy vấn trên nhiều bảng. Nếu bạn dùng LINQ, thì việc truy vấn này là thường xuyên, một mệnh đề bạn thường dùng là join và trên thực tế các lập trình viên cũng dùng join rất nhiều. Để thực hiện left outer join hoặc right outer join, bạn có thể theo dõi bài viết Phần 9: Các toán tử truy vấn chuẩn trong LINQ 2.

Trong ví dụ sau, bạn có 3 bảng Student, Course và Teacher với mô tả như sau. Một sinh viên (Student) có thể học nhiều môn học (Course) và tương tự 1 giáo viên (Teacher) cũng có thể dạy nhiều môn học (Course).

  • Student(StudentID, StudentName) với StudentID khóa chính kiểu int, StudentName kiểu string.
  • Course(CourseID, StudentID, TeacherID, CourseName) với CourseID khóa chính kiểu int; StudentID, TeacherID kiểu int; CourseName kiểu string.
  • Teacher(TeacherID, TeacherName) với TeacherID khóa chính kiểu int, TeacherName kiểu string.

Yêu cầu đặt ra là bạn truy vấn 3 bảng này để hiển thị thông tin khóa học và thông tin sinh viên, giáo viên của khóa học đó. Bạn có thể dùng mệnh đề join như sau.

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace LINQ
{
    class Program
    {
        public class Student
        {
            public int StudentID; // khóa chính
            public string StudentName;
        }

        public class Course
        {
            public int CourseID; // khóa chính
            public int StudentID; // khóa ngoại
            public int TeacherID; // khóa ngoại
            public string CourseName;
        }

        public class Teacher
        {
            public int TeacherID; // khóa chính
            public string TeacherName;
        }


        static void Main(string[] args)
        {
            List<Student> students = new List<Student>();
            students.Add(new Student() { StudentID = 111, StudentName = "Hoang" });
            students.Add(new Student() { StudentID = 112, StudentName = "Van" });
            students.Add(new Student() { StudentID = 113, StudentName = "Khang" });

            List<Teacher> teachers = new List<Teacher>();
            teachers.Add(new Teacher() { TeacherID = 222, TeacherName = "Dammio" });
            teachers.Add(new Teacher() { TeacherID = 223, TeacherName = "John" });
            teachers.Add(new Teacher() { TeacherID = 224, TeacherName = "David" });

            List<Course> courses = new List<Course>();
            courses.Add(new Course() { CourseID = 1, StudentID = 111, TeacherID = 222, CourseName="LINQ" });
            courses.Add(new Course() { CourseID = 1, StudentID = 112, TeacherID = 222, CourseName = "LINQ" });
            courses.Add(new Course() { CourseID = 1, StudentID = 113, TeacherID = 222, CourseName = "LINQ" });
            courses.Add(new Course() { CourseID = 2, StudentID = 111, TeacherID = 223, CourseName = "Web" });
            courses.Add(new Course() { CourseID = 3, StudentID = 113, TeacherID = 224, CourseName = "C#" });

            var query = (from s in students
                        join c in courses on s.StudentID equals c.StudentID
                        join t in teachers on c.TeacherID equals t.TeacherID
                        select new
                        {
                            s.StudentID, s.StudentName, c.CourseID, c.CourseName, t.TeacherID, t.TeacherName
                        }).OrderBy(x=>x.CourseID);

            
            Console.WriteLine("StudentID \t StudentName \t CourseID \t CourseName \t TeacherID \t TeacherName");
            Console.WriteLine("-----------------------------------------------------------------------------------------");
            foreach (var item in query)
            {
                Console.WriteLine(item.StudentID + " \t\t" + item.StudentName + " \t\t " + item.CourseID
                    + "\t\t" + item.CourseName + " \t\t " + item.TeacherID + " \t\t " + item.TeacherName);
            }

            Console.ReadLine();

        }
    }
}

Trong đoạn mã trên, bạn có thể thấy truy vấn LINQ dùng mệnh đề join với cú pháp:

join x in y on y.ID equals c.ID

trong đó x là viết tắt rút gọn của bảng y, c là kiểu viết tắt của bảng khác, y.ID phải có cùng kiểu dữ liệu của c.ID để so sánh.

Lưu ý khi dùng join, bạn phải hiểu đây là inner join, tức là các bảng phải có dữ liệu liên kết theo chỉ số ID thì dữ liệu mới được hiển thị, chẳng hạn, bảng Student có StudentID=111 thì bảng Course cũng phải có StudentID=111 để dữ liệu 2 bảng join được với nhau và hiển thị ở kết quả cuối cùng.

Liên quan:  [LINQ và chuỗi] Phần 4: Kết hợp LINQ và biểu thức chính quy (C#)

Nếu có nhiều bảng cần join thì bạn cứ thêm mệnh đề join liên tiếp, nhưng chú ý dữ liệu khi join phải khớp nhau. Cuối cùng, trong ví dụ sử dụng OrderBy(x=>x.CourseID) để sắp xếp dữ liệu đầu ra theo thứ tự tăng dần của CourseID. Ngoài mệnh đề join, bạn có thể sử dụng concat, aggregate,… tùy theo nhu cầu và mục đích lấy dữ liệu của bạn.

Trích dẫn bài viết
  • APA:
    Dammio. (2018). Kết nối nhiều bảng bằng join trong LINQ. https://www.dammio.com/2018/07/02/ket-noi-nhieu-bang-bang-join-trong-linq.
  • BibTeX:
    @misc{dammio,
    author = {Dammio},
    title = {Kết nối nhiều bảng bằng join trong LINQ},
    year = {2018},
    url = {https://www.dammio.com/2018/07/02/ket-noi-nhieu-bang-bang-join-trong-linq},
    urldate = {2024-07-23}
    }
Theo dõi
Thông báo của
guest
0 Góp ý
Phản hồi nội tuyến
Xem tất cả bình luận
0
Rất thích suy nghĩ của bạn, hãy bình luận.x