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ọ.
Đ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(); } } }
- 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}
}
[…] Đă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 >> […]