Tại sao phải sử dụng LINQ ?

Tại sao phải sử dụng LINQ ?

Để hiểu được tại sao chúng ta nên sử dụng LINQ , hãy xem một vài ví dụ sau đây. Giả sử bạn muốn tìm kiếm một đối tượng học sinh có độ tuổi từ 13 - 19 từ một mảng Students

Trước C# 2.0 , chúng ta phải sử dụng vòng lặp 'foreach' hoặc 'for' để duyệt qua tập hợp(Collection) để mà tìm kiếm những đối tượng cụ thể nào đó . Ví dụ , chúng ta phải viết mã sau để tìm kiếm tất cả đối tượng Student từ một mảng Students với điều kiện là tuổi(age) từ 13 đến 19 :


Ví dụ: Sử dụng vòn lặp for để tìm kiếm những phần tử từ một tập hợp C# 1.0
            
class Student
{
    public int StudentID { get; set; }
    public String StudentName { get; set; }
    public int Age { get; set; }
}

class Program
{
    static void Main(string[] args)
    {
        Student[] studentArray = { 
            new Student() { StudentID = 1, StudentName = "John", Age = 18 },
            new Student() { StudentID = 2, StudentName = "Steve",  Age = 21 },
            new Student() { StudentID = 3, StudentName = "Bill",  Age = 25 },
            new Student() { StudentID = 4, StudentName = "Ram" , Age = 20 },
            new Student() { StudentID = 5, StudentName = "Ron" , Age = 31 },
            new Student() { StudentID = 6, StudentName = "Chris",  Age = 17 },
            new Student() { StudentID = 7, StudentName = "Rob",Age = 19  },
        };

        Student[] students = new Student[10];

        int i = 0;

        foreach (Student std in studentArray)
        {
            if (std.Age > 12 && std.Age < 20)
            {
                students[i] = std;
                i++;
            }
        }
    }
}


Sử dụng vòng lặp for là rối rắm , khó bảo trì và khó đọc code . Ở phiên bản 
C# 2.0 giới thiệu khái niệm mới là delegate , delegate có thể được sử dụng để 
xử lý loại kịch bản , như hình dưới đây.


Ví dụ: Sử dụng delegates để tìm kiếm các phần tử từ một tập hợp C# 2.0
            
delegate bool FindStudent(Student std);

class StudentExtension
{ 
    public static Student[] where(Student[] stdArray, FindStudent del)
    {
        int i=0;
        Student[] result = new Student[10];
        foreach (Student std in stdArray)
            if (del(std))
            {
                result[i] = std;
                i++;
            }

        return result;
    }
}
    
class Program
{
    static void Main(string[] args)
    {
        Student[] studentArray = { 
            new Student() { StudentID = 1, StudentName = "John", Age = 18 } ,
            new Student() { StudentID = 2, StudentName = "Steve",  Age = 21 } ,
            new Student() { StudentID = 3, StudentName = "Bill",  Age = 25 } ,
            new Student() { StudentID = 4, StudentName = "Ram" , Age = 20 } ,
            new Student() { StudentID = 5, StudentName = "Ron" , Age = 31 } ,
            new Student() { StudentID = 6, StudentName = "Chris",  Age = 17 } ,
            new Student() { StudentID = 7, StudentName = "Rob",Age = 19  } ,
        };

        Student[] students = StudentExtension.where(studentArray, delegate(Student std){
                return std.Age > 12 && std.Age < 20;
            });
        }
    }
}

Vì vậy , với C# 2.0 , bạn có được những tính tăng của delegate trong việc tìm kiếm những học sinh với bất kỳ tiêu chí nào . Ví dụ , bạn có thể sử dụng delegate function tương tự để tìm kiếm học sinh với tiêu chí StudentId  = 5 hoặc name = Bill , như sau:

Student[] students = StudentExtension.where(studentArray, delegate(Student std) {
        return std.StudentID == 5;
    });

//Also, use another criteria using same delegate
Student[] students = StudentExtension.where(studentArray, delegate(Student std) {
        return std.StudentName == "Bill";
    });

Đội ngũ phát triển C# cảm thấy rằng họ cần phải làm cho đoạn code gọn và dễ đọc . Vì vậy họ giới thiệu một số tính năng trong C# 3.0 như extension method , lambda expression , expression tree , anonymous type và query expression. Bạn có thể sử dụng các tính năng này trong C# 3.0 , Những tính năng này xây dựng lên khối LINQ để truy vấn đến những kiểu tập hợp khác nhau và lấy những phần tử kết quả trong một câu lệnh.
Ví dụ dưới đây cho bạn thấy rằng làm thế nào bạn sử dụng câu truy vấn LINQ với biểu thử lambda để tìm kiếm đối tượng học sinh cụ thể từ một tập hợp các đối tượng hoc sinh.
class Program
{
    static void Main(string[] args)
    {
        Student[] studentArray = { 
                    new Student() { StudentID = 1, StudentName = "John", age = 18 } ,
                    new Student() { StudentID = 2, StudentName = "Steve",  age = 21 } ,
                    new Student() { StudentID = 3, StudentName = "Bill",  age = 25 } ,
                    new Student() { StudentID = 4, StudentName = "Ram" , age = 20 } ,
                    new Student() { StudentID = 5, StudentName = "Ron" , age = 31 } ,
                    new Student() { StudentID = 6, StudentName = "Chris",  age = 17 } ,
                    new Student() { StudentID = 7, StudentName = "Rob",age = 19  } ,
                };

        //  Sử dụng LinQ để tìm kiếm học sinh có độ tuổi 13-19
        Student[] teenAgerStudents = studentArray.Where(s => s.age > 12 && s.age < 20).ToArray();
       
        // Use LINQ to find first student whose name is Bill 
        Student bill = studentArray.Where(s => s.StudentName == "Bill").FirstOrDefault();
        
        // Use LINQ to find student whose StudentID is 5
        Student student5 = studentArray.Where(s => s.StudentID == 5).FirstOrDefault();
    }
}

Như bạn thấy trong ví dụ trên , chúng ta chỉ định tiêu chí khác nhau bằng cách sử 
dụng toán tử LINQ và  biểu thức lambda trong một câu lệnh . LINQ làm cho đoạn 
code gọn và dễ đọc hơn . Nó cũng được dùng để truy vấn những nguồn dữ liệu khác
nhau . Ví dụ , nếu bạn có một bảng student in trong database thay vì một cái mảng
đối tượng student như trên , bạn cũng có thể sử dụng câu truy vấn tương tự để tìm
kiếm bằng cách sử dụng thư viện Entity Frameword.

Những lợi ích của LINQ:


  • Ngôn ngữ quen thuộc: Các nhà phát triển không cần phải học một ngôn ngữ truy vấn mới cho từng nguồn dữ liệu hoặc định dạng dữ liệu..
  • Code viết ra ít hơn : Nó giúp giảm thiểu lượng mã được viết ra so với hướng tiếp cận truyền thống là dùng vòng lặp for , foreach
  • Code dễ đọc hơn: Linq làm cho code dễ đọc hơn vì thế các nhà phát triển các dễ dàng hiểu và bảo trì nó.
  • Cách chuẩn hóa truy vấm nhiều nguồn dữ liệu: Cú pháp LinQ có thể sử dụng để truy vấn nhiều nguồn dữ liệu.
  • 
    
    (Nguồn : http://www.tutorialsteacher.com/linq/why-linq)
    
    

    Nhận xét

    Bài đăng phổ biến từ blog này

    Web API : Parameter Binding

    Web API Routing

    Action Method Return Type