Trang chủ » LinQ là gì?
Lập trình C#

LinQ là gì?

linq thumbnail

Dữ liệu, linh hồn của một phần mềm, và việc xử lý dữ liệu luôn là một trong những vấn đề quan trọng nhất của mỗi phần mềm. Với những dữ liệu có cấu trúc, ta thường cài đặt các câu lệnh xử lý dữ liệu sao cho phù hợp với cấu trúc nhất. Tuy nhiên mọi chuyện trở nên phức tạp hơn khi cấu trúc dữ liệu bị thay đổi. Để có thể đơn giản đến mức tối đa, LinQ đã ra đời. Vậy LinQ là gì?

Xin chào mọi người! Những ngày đầu tiên mình tiếp xúc C#, việc xử lý thông tin của mình đơn giản là “vòng lặp, kiểm tra điều kiện đối tượng trong mảng hợp lệ thì cho vào mảng phụ”. Nhưng mọi chuyện bắt đầu phức tạp hơn khi có nhiều mảng muốn xử lý cùng lúc, đặc biệt là XML. Rất may, Microsoft đã hiểu được tầm quan trọng của việc xử lý dữ liệu, và đã tung ra LinQ ở phiên bản .NET Framework 3.5 vào tháng 11/2007.

what is linq
LinQ là gì?

LinQ là gì?

LinQ (Language Integrated Query) là 1 thư viện được tích hợp trong .NET Framework 3.5 dành cho C# lẫn VB (nhưng ở đây mình sẽ xoáy sâu vào C#). LinQ hiểu đơn giản là “mang SQL vào C#”, nó cung cấp khả năng truy vấn dữ liệu trực tiếp ngay trên chính C#. Mặc dù hiện tại có rất nhiều ngôn ngữ đã “mang LinQ về với bản làng” (PHP, JavaScript, TypeScript lẫn ActionScript), nhưng tất cả đều chỉ là những library bên ngoài, không được hỗ trợ tận răng như C#.

Để hiểu được tầm quan trọng của LinQ, hãy cùng xét 1 ví dụ nho nhỏ sau: mình có 1 mảng Student chứa thông tin tất cả các học sinh của 1 trường, và 1 mảng Classroom chứa thông tin phòng học.

class Program
{
    static void Main(string[] args)
    {
        Student[] studentArray = {
            new Student() { ID = 1, Name = "Son", Age = 20, UniversityID = 1 },
            new Student() { ID = 2, Name = "Hai", Age = 19, UniversityID = 2 },
            new Student() { ID = 3, Name = "An", Age = 22, UniversityID = 1 },
            new Student() { ID = 4, Name = "Hien", Age = 20, UniversityID = 3 },
            new Student() { ID = 5, Name = "Phat", Age = 21, UniversityID = 2 }
        }

        University[] universityArray = {
            new University() { ID = 1, Name = "HCMUS" },
            new University() { ID = 2, Name = "HCMUT" },
            new University() { ID = 3, Name = "UIT" },
        }
    }
}

Sẽ thật sự dễ dàng nếu mình yêu cầu “tìm tất cả các sinh viên có tuổi lớn hơn 20”.

foreach (Student student in studentArray)
{
    if (student.Age > 20)
        // Do something
}

Nhưng nếu vấn đề đặt ra là “tìm sinh viên tên Sơn học ở trường nào” thì sao? Phải tạo 1 mảng mới, trộn các dữ liệu từ 2 mảng studentArray và universityArray và chạy vòng foreach? Tuy nhiên với LinQ, mọi thứ dường như đơn giản hơn rất nhiều:

var universityOfSon = from student in studentArray
                      join university in universityArray
                      on student.UniversityID equals university.ID
                      where student.Name="Son"
                      select university;

Nếu bạn có 1 số kiến thức về SQL, liệu bạn có hiểu được đoạn code trên không? Đến đây chắc bạn đã hiểu tại sao LinQ lại quan trọng rồi chứ :D?

Phân loại

Hiện tại, LinQ hỗ trợ các công nghệ sau:

understanding linq
Phân loại LinQ.

Sử dụng LinQ

Việc sử dụng LinQ sẽ dễ dàng hơn với những bạn đã từng học SQL. LinQ có 2 cách sử dụng là Query Syntax và Method Syntax. Sau đây mình sẽ hướng dẫn sử dụng LinQ to XML với select, insert, update và delete (với dữ liệu mẫu ở phía trên). Trước khi bắt đầu, mình sẽ chuyển các mảng sang XML:

xml string sample

Select

Giả sử mình muốn lọc danh sách sinh viên học ở trường Đại học Khoa học tự nhiên (HCMUS) thì sao?

// Query Syntax
var studentsOfHcmus = from student in xdocStudent.Root.Elements()
			join university in xdocUniversity.Root.Elements()
			on student.Attribute("UniversityID").Value equals university.Attribute("ID").Value
			where university.Attribute("Name").Value == "HCMUS"
			select student;
// Method Syntax
// Ở đây mình có sử dụng Lambda Expression, cụ thể là ở method .Where()
var studentsOfHcmus = xdocStudent.Root.Elements()
			.Join(xdocUniversity.Root.Elements()
					.Where(university => university.Attribute("Name").Value == "HCMUS"),
				student => student.Attribute("UniversityID").Value,
				university => university.Attribute("ID").Value,
				(student, university) => student);

Để ý kỹ ở biến studentOfHcmus, các bạn sẽ thấy kiểu trả về như thế này:

ienumerable linq

Ở đây mình sẽ không nói nhiều về interface IEnumerable. Một mảng IEnumerable là 1 mảng read-only, và các Collections như List, ArrayList, Dictionary có thể dùng foreach để duyệt được là nhờ implement interface này. Vậy thì mình sẽ dùng foreach để duyệt và xuất ra Console xem nhé:

result select linq
Vi diệu chưa nào?

Ngoài ra, trong LinQ hỗ trợ filter, order, group, join data để cho câu lệnh của bạn trở nên chính xác hơn (xem chi tiết tại đây).

Insert

Thêm 1 bạn sinh viên Bách Khoa nhé!

insert result linq

Mình không demo code ở đây vì Insert trong LinQ, nếu các bạn để ý kĩ thì nó tương tự như method Add() của các Collections như List, ArrayList, Dictionary,… nên sẽ không có gì quá khác biệt.

Update

Hừmmmm, bạn Hải đang có ý định muốn chuyển trường qua học UIT thì sao nhỉ?

// Query Syntax
var studentsChanged = from student in xdocStudent.Root.Elements()
			join university in xdocUniversity.Root.Elements()
			on student.Attribute("UniversityID").Value equals university.Attribute("ID").Value
			where student.Attribute("Name").Value == "Hai"
			select student;
// Method Syntax
var studentsChanged = xdocStudent.Root.Elements()
			.Join(xdocUniversity.Root.Elements(),
			student => student.Attribute("UniversityID").Value,
			university => university.Attribute("ID").Value,
			(student, university) => student)
			.Where(student => student.Attribute("Name").Value == "Hai");

foreach (XElement student in studentsChanged)
{
	// UIT có mã trường là 3
	student.Attribute("UniversityID").Value = "3";
}

Và cuối cùng, khi xuất kết quả:

result update linq

Delete

Bạn An đã nộp đơn xin thôi học, vậy thì dữ liệu XML của ta sẽ làm như thế nào nhỉ?

// Lấy sinh viên muốn cho thôi học
// Query Syntax
var studentQuited = from student in xdocStudent.Root.Elements()
			where student.Attribute("Name").Value == "An"
			select student;
// Method Syntax
var studentQuited = xdocStudent.Root.Elements().Where(student => student.Attribute("Name").Value == "An");

// Cho thôi học
studentQuited.Remove();

Và chúng ta cùng xem kết quả:

result delete linq
Bạn An đã thôi học rồi nhé!

Có lẽ đến đây thì mọi người đã hiểu được sự bá đạo của LinQ rồi nhỉ? Xin cảm ơn mọi người đã quan tâm theo dõi! Hẹn gặp lại ở những bài viết tiếp theo.

About the author

Võ Hoài Sơn

Tính tình bất định
Chọc vào là bịnh
Rất yêu lập trình
Luôn code hết mình
Mình hiện đang là sinh viên của trường ĐH Khoa học tự nhiên TPHCM. Bản thân rất thích code, kiêm luôn cả mần thơ nên thường hơi hâm hâm dở dở. Ngoài ra chém gió, chém chuối, chém trái cây các kiểu cũng là sở trường của mình. Rất mong được làm quen với các bạn :D

Add Comment