Kết nối

Ví dụ các câu truy vấn LINQ – Phần 3

101 lượt xem 

Trong loạt bài viết này, bạn sẽ xem các ví dụ về truy vấn LINQ thì cấp độ dễ đến khó, hi vọng thông qua các ví dụ, bạn sẽ dễ hiểu hơn về truy vấn LINQ cũng như có hứng thú học. Mặc dù nỗ lực đưa ra các ví dụ mang tính thực tế, tuy nhiên chúng không thể bao quát hết được các vấn đề về truy vấn LINQ. Khi đó, bạn có thể gợi ý để chúng tôi có thể tiếp tục xây dựng các ví dụ ngày càng phong phú. Ngoài ra, mời bạn xem LINQ cơ bản nếu chưa biết gì về LINQ.

1. Ví dụ join từ 2 tập dữ liệu

Trong ví dụ sau, chúng ta join 2 tập Student (Sinh viên) và Course (Khóa học) với nhau để xem danh sách từng sinh viên theo từng khóa học. Do khóa học thuộc tính danh sách sinh viên đăng ký EnrolledStudents là 1 danh sách số nguyên chứa các id của sinh viên, chúng ta phải làm phẳng danh sách khóa học trước khi thực hiện join mới cho ra kết quả chính xác.

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

namespace ConsoleApp1
{
    using System;
    using System.Collections.Generic;
    using System.Linq;


    class Program
    {

        // Định nghĩa lớp sinh viên
        class Student
        {
            public int StudentId { get; set; }
            public string Name { get; set; }
        }

        // Định nghĩa lớp khóa học
        class Course
        {
            public int CourseId { get; set; }
            public string CourseName { get; set; }
            public List<int> EnrolledStudents { get; set; }
        }

        static void Main(string[] args)
        {
            // Hiển thị tiếng Việt ở chế độ console
            Console.OutputEncoding = Encoding.UTF8;

            // Tạo danh sách sinh viên
            List<Student> students = new List<Student>
            {
                new Student { StudentId = 1, Name = "Alice" },
                new Student { StudentId = 2, Name = "Bob" },
                new Student { StudentId = 3, Name = "Charlie" },
                new Student { StudentId = 4, Name = "David" },
                new Student { StudentId = 5, Name = "Eve" }
            };

            // Tạo danh sách khóa học
            List<Course> courses = new List<Course>
            {
                new Course { CourseId = 101, CourseName = "Math", EnrolledStudents = new List<int> { 1, 2, 3 } },
                new Course { CourseId = 102, CourseName = "Science", EnrolledStudents = new List<int> { 2, 4, 5 } },
                new Course { CourseId = 103, CourseName = "History", EnrolledStudents = new List<int> { 1, 3, 4 } }
            };

            // Truy vấn kết hợp LINQ để tìm ra sinh viên đã đăng ký khóa học có CourseId = 101

            // a. Làm phẳng mỗi sinh viên theo từng khóa học
            // DAMMIO.COM
            var studentbycourse = from course in courses
                         from StudentId in course.EnrolledStudents
                         select new {course.CourseId, course.CourseName, StudentId};

            Console.WriteLine($"Làm phẳng danh sách, mỗi sinh viên theo mỗi khóa học: ");
            foreach (var value in studentbycourse)
            {
                Console.WriteLine(value);
            }

            var studentsInCourse = (from course in studentbycourse
                                  join student in students
                                    on course.StudentId equals student.StudentId
                                    select new { studentid = student.StudentId, studentname = student.Name, courseid = course.CourseId, 
                                        coursename = course.CourseName }).Distinct().ToList();

            //Console.WriteLine("**********************************");

            // Hiển thị tên của những sinh viên đã đăng ký khóa học
            Console.WriteLine($"Những sinh viên đã đăng ký khóa học:");
            foreach (var studentName in studentsInCourse)
            {
                Console.WriteLine(studentName);
            }
            Console.ReadLine();
        }
    }

}

2. Ví dụ join từ 3 tập dữ liệu

Dưới đây là một ví dụ về cách tạo dữ liệu và sử dụng truy vấn kết hợp từ ba tập dữ liệu LINQ trong C#. Trong ví dụ này, chúng ta sẽ tạo ba danh sách: một danh sách chứa thông tin về người, một danh sách chứa thông tin danh sách các cuộc họp và một danh sách chứa thông tin về việc làm. Sau đó, chúng ta sẽ sử dụng truy vấn kết hợp LINQ để tìm ra những người tham gia cả cuộc họp và công việc của họ.

Liên quan:  [LINQ và chuỗi] Phần 3: Truy vấn các ký tự trong chuỗi

Điểm khó của ví dụ trên đó là danh sách Meetings chứa danh sách Id người tham dự, vì vậy, bạn cần làm phẳng Meetings trước khi thực hiện join trên 3 bảng để có kết quả chính xác nhất. Nếu có câu lệnh LINQ gọn hơn thì mời bạn chia sẻ nhé.

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

namespace ConsoleApp1
{
    class Program
    {
        // Định nghĩa lớp người
        class Person
        {
            public int Id { get; set; }
            public string Name { get; set; }
        }

        // Định nghĩa lớp cuộc họp
        class Meeting
        {
            public int MeetingId { get; set; }
            public string Title { get; set; }
            public List<int> Participants { get; set; }
        }

        // Định nghĩa lớp công việc
        class Job
        {
            public int JobId { get; set; }
            public string Title { get; set; }
            public int EmployeeId { get; set; }
        }

        static void Main(string[] args)
        {
            // Hiển thị tiếng Việt ở chế độ console
            Console.OutputEncoding = Encoding.UTF8;

            // Tạo danh sách người
            List<Person> people = new List<Person>
            {
            new Person { Id = 1, Name = "Alice" },
            new Person { Id = 2, Name = "Bob" },
            new Person { Id = 3, Name = "Charlie" },
            new Person { Id = 4, Name = "David" },
            new Person { Id = 5, Name = "Eve" }
            };

            // Tạo danh sách cuộc họp
            List<Meeting> meetings = new List<Meeting>
            {
            new Meeting { MeetingId = 101, Title = "Meeting A", Participants = new List<int> { 1, 3, 4 } },
            new Meeting { MeetingId = 102, Title = "Meeting B", Participants = new List<int> { 2, 4 } },
            new Meeting { MeetingId = 103, Title = "Meeting C", Participants = new List<int> { 1, 2, 3 } },
            new Meeting { MeetingId = 104, Title = "Meeting D", Participants = new List<int> { 5 } }
            };

            // Tạo danh sách công việc
            List<Job> jobs = new List<Job>
            {
            new Job { JobId = 201, Title = "Developer", EmployeeId = 1 },
            new Job { JobId = 202, Title = "Designer", EmployeeId = 2 },
            new Job { JobId = 203, Title = "Manager", EmployeeId = 3 },
            new Job { JobId = 204, Title = "Tester", EmployeeId = 4 },
            new Job { JobId = 205, Title = "Administrator", EmployeeId = 5 }
            };

            // Truy vấn kết hợp LINQ để tìm người tham gia cả cuộc họp và công việc
            // a. Làm phẳng cuộc họp, mỗi cuộc họp chỉ có 1 người tham gia. Cách viết này dài và khó hơn ví dụ 1 nhưng DAMMIO.COM vẫn đưa ra sẽ các bạn tham khảo
            List<Meeting> flat_meetings = new List<Meeting>();
            foreach (Meeting meeting in meetings)
            {
                
                foreach (int Id in meeting.Participants)
                {
                    
                    Meeting temp_meeting = new Meeting();
                    temp_meeting.MeetingId = meeting.MeetingId;
                    temp_meeting.Title = meeting.Title;
                    //temp_meeting = meeting;
                    temp_meeting.Participants = new List<int> { Id };
                    //Console.WriteLine(temp_meeting.Participants[0]);
                    
                    flat_meetings.Add(temp_meeting);
                    temp_meeting = new Meeting();
                }
            }
            
            foreach (var x in flat_meetings)
            {
                Console.WriteLine($"{x.MeetingId} - Cuộc họp: {x.Title}, Công việc: {x.Participants[0]}");
            }
            Console.WriteLine("*****************************");
            // b. Hiển thị cuộc họp và công việc của người tham gia
            var participantsInMeetingAndJob = from person in people
                                              join meeting in flat_meetings
                                              on person.Id equals  meeting.Participants[0]
                                              join job in jobs
                                              on person.Id equals job.EmployeeId
      
                                              select new
                                              {
                                                  person.Name,
                                                  MeetingTitle = meeting.Title,
                                                  JobTitle = job.Title
                                              };

            
            // Hiển thị thông tin của những người tham gia cả cuộc họp và công việc
            Console.WriteLine("Những người tham gia cả cuộc họp và công việc:");
            foreach (var personInfo in participantsInMeetingAndJob)
            {
                Console.WriteLine($"{personInfo.Name} - Cuộc họp: {personInfo.MeetingTitle}, Công việc: {personInfo.JobTitle}");
            }
            Console.ReadLine();
        }
    }
}
Trích dẫn bài viết
  • APA:
    Dammio. (2023). Ví dụ các câu truy vấn LINQ – Phần 3. https://www.dammio.com/2023/10/09/vi-du-cac-cau-truy-van-linq-phan-3.
  • BibTeX:
    @misc{dammio,
    author = {Dammio},
    title = {Ví dụ các câu truy vấn LINQ – Phần 3},
    year = {2023},
    url = {https://www.dammio.com/2023/10/09/vi-du-cac-cau-truy-van-linq-phan-3},
    urldate = {2025-01-17}
    }
Theo dõi
Thông báo của
guest
1 Bình luận
Cũ nhất
Mới nhất Được bỏ phiếu nhiều nhất
Phản hồi nội tuyến
Xem tất cả bình luận
trackback

[…]  Đăng ngày: 08/10/2023 lúc 17:08:2109/10/2023 lúc 19:03:56 bởi dammio 11 lượt xem   Cập nhật lần cuối: 09/10/2023 lúc 19:03:56 Thể loại: C#, Lập trình Web, Lập trình Web với ASP.NET, LINQ, Ngôn ngữ lập trình  << Bài trước Trang mục lục Bài tiếp theo >> […]

1
0
Rất thích suy nghĩ của bạn, hãy bình luận.x