Monday, April 9, 2012

Bài 02: Giới thiệu về các truy vấn LINQ

Trong ví dụ trước vì dữ liệu là một mảng, nó hoàn toàn hỗ trợ đặc điểm chung giao diện IEnumerable <T>. Điều này có nghĩa thực tế nó có thể được truy vấn với LINQ. Một truy vấn được thực hiện trong một câu lệnh foreach và foreach yêu cầu IEnumerable hay IEnumerable(T). Loại có hỗ trợ IEnumerable(T) hoặc một giao diện như IQueryable(T) được gọi là các loại queryable. Một loại queryable không yêu cầu phải sửa đổi hay xử lý đặc biệt để phục vụ một LINQ nguồn dữ liệu. Nếu các nguồn dữ liệu không phải là đã có trong bộ nhớ như là một loại queryable, một nhà cung cấp LINQ phải đại diện cho nó như vậy. Ví dụ, LINQ to XML một tài liệu XML vào một queryable XElement:Một câu truy vấn là một biêu thức gọi ra dữ liệu từ dữ liệu nguồn. Câu truy vấn thường nói rõ trong ngôn ngữ truy vấn đữ được thiết kế cho mục dích riêng. Các ngôn ngữ khác nhau đã được phát triển theo thời gian cho các loại dữ liệu ngồn, ví dụ như SQL dành cho cơ sở dữ liệu quan hệ và XQuery dành cho XML. Vì vậy các nhà phát triển đã tìm hiểu một ngôn ngữ truy vấn mới cho các loại dữ liệu nguồn hoặc các định dạng mà họ phải hỗ trợ. LINQ đơn giản tình trạng này bằng cách cung cấp một mô hình nhất quán để làm việc với các loại dữ liệu nguồn khác nhau và các định dạng. Trong một truy vấn LINQ bạn phải luôn luôn làm việc với các đối tượng. Bạn sử dụng giống như truy vấn mẫu cơ bản mã hóa và chuyển đổi dữ liệu trong các tài liệu XML, cơ sở dữ liệu SQL, ADO.NET DataSet và cho bất kì một định đạng nào mà một nhà cung cấp LINQ có sẵn.

1. Ba phần của một biểu thức LINQ.

Tất cả các biểu thức LINQ làm việc theo ba thao tác.
1. Có được các dữ liệu nguồn.
2. Tạo các truy vấn.
3. Thực hiện các truy vấn.
Ví dụ trong mã nguồn sau đây cho thấy ba phần của một truy vấn hoạt động như thế nào. Ví dụ sử dụng một mảng số nguyên như là một sự thay thế cho nguồn dữ liệu; tuy nhiên, trong cùng một khái niệm áp dụng cho các nguồn dữ liệu khác cũng có.
Ví dụ này sẽ được giới thiệu đến trong suốt phần còn lại của chủ đề này.

    class IntroToLINQ

    {

        static void Main()

        {

            // The Three Parts of a LINQ Query:

            // 1. Data source.

            int[] numbers = new int[7] { 0, 1, 2, 3, 4, 5, 6 };

            // 2. Query creation.

            // numQuery is an IEnumerable<int>

            var numQuery = from num in numbers

                           where (num % 2) == 0

                           select num;

 

            // 3. Query execution.

            foreach (int num in numQuery)

            {

                Console.Write("{0,1} ", num);

            }

        }

    }


Minh họa sau đây cho thấy các hoạt động truy vấn tìm kiếm được hoàn tất. Trong LINQ việc thực hiện các truy vấn riêng biệt từ bản thân câu truy vấn. Nói cách khác bạn không lấy ra bất kỳ dữ liệu nào bằng cách tạo ra một biến truy vấn.




2. Các nguồn dữ liệu.
Trong ví dụ trước vì dữ liệu là một mảng, nó hoàn toàn hỗ trợ đặc điểm chung giao diện IEnumerable <T>. Điều này có nghĩa thực tế nó có thể được truy vấn với LINQ. Một truy vấn được thực hiện trong một câu lệnh foreach và foreach yêu cầu IEnumerable hay IEnumerable(T). Loại có hỗ trợ IEnumerable(T) hoặc một giao diện như IQueryable(T) được gọi là các loại queryable. Một loại queryable không yêu cầu phải sửa đổi hay xử lý đặc biệt để phục vụ một LINQ nguồn dữ liệu. Nếu các nguồn dữ liệu không phải là đã có trong bộ nhớ như là một loại queryable, một nhà cung cấp LINQ phải đại diện cho nó như vậy. Ví dụ, LINQ to XML một tài liệu XML vào một queryable XElement:

foreach (int num in numQuery)

{

    Console.Write("{0,1} ", num);

}


Với LINQ to SQL trước tiên bạn tạo một đối tượng quan hệ được ánh xạ vào lúc thiết kế cái này được làm thủ công hoặc bằng cách sử dụng trình thiết kế đối tượng quan hệ (O/R Designer). Bạn viết các câu truy vấn của bạn dựa trên đối tượng và thi hành LINQ to SQL để xử lý các giao tiếp với cơ sở dữ liệu. Trong ví dụ sau, Customer đại diện cho một bảng trong cơ sở dữ liệu, và Table<Customer> hỗ trợ các đặc tính chung IQueryable<T> mà được bắt đầu từ IEnumerable<T>.

// Create a data source from a SQL Server database.

// using System.Data.Linq;

DataContext db = new DataContext(@"c:\northwind\northwnd.mdf");

 

 

3. Truy vấn.
Truy vấn trong ví dụ trước trả về tất cả các số từ mảng số nguyên. Các biểu thức truy vấn chứa ba mệnh đề: from, where, select. (Nếu bạn đang quen với SQL sắp đặt của các mệnh đề là sai vị trí trong SQL). Mệnh đề from dùng để xác định nguồn dữ liệu, mệnh đề where dùng để lọc dữ liệu, mệnh đề select dùng để chọn ra những phần tử được trả về. các mệnh đề này và các mệnh đề truy vấn khác sẽ được thảo luận chi tiết trong phần LINQ Query Expresstions(Hướng dẫn lập trình C#). Lúc này một điểm quan trọng là trong LINQ, các biến truy vấn tựu nó không
hành động và trả về không có dữ liệu. Nó chỉ chứa đựng thông tin đó là yêu cầu từ kết quả trả về khi câu truy vấn được thực hiện tại một số điểm sau.

3.1 Thực thi truy vấn:
Hoãn thực thi:
Cũng giống như trạng thái trước đây, biến truy vấn tự nó chỉ chứa các lệnh truy vấn. Hiện nay sự thực thi của các truy vấn là hoãn lại đến tận khi bạn nhắc lại đối với biến truy vấn trong câu lệnh foreach. Cái này làm cơ sở để quy cho hoãn thực thi và là cái điển hình trong ví dụ sau:

foreach (int num in numQuery)

{

    Console.Write("{0,1} ", num);

}

 

Câu lệnh foreach là nơi các kết quả truy vấn được trả về ví dụ các truy vấn trước đó biến num được lặp và nắm dữ mỗi giá trị trong trình tự trả về. Bởi các biến truy vấn tự nó không bao giờ chứa kết quả truy vấn, bạn có thể thực hiện nó thường xuyên như bạn muốn. Ví dụ bạn đang có một cơ sở dữ liệu mà đang được cập nhập liên tục bởi một ứng dụng riêng biệt. Trong ứng dụng của bạn, bạn có thể tạo một truy vấn để lấy ra dữ liệu mới nhất và bạn có thể thi hành nó một cách liên tục tại một khoảng thời gian để lấy kết quả mỗi lần.

3.2 Thực thi bắt buộc tức thời:

Truy vấn mà sự kết hợp thực hiện các chức năng trên một loạt các phần tử nguồn đầu tiên phải lặp đi lặp lại trên những nhần tử. Ví dụ như các truy vấn Count, Max, Average, và First. Những thực thi mà không có một câu lệnh foreach nào rõ ràng bởi vì các truy vấn tự nó phải sử dụng foreach để trả về là một kết quả. Cũng lưu ý rằng các loại truy vấn trả lại một giá trị, không phải là một tập IEnumerable. Các truy vấn sau đây sẽ trả về một số lượng các số trong mảng nguồn:

var evenNumQuery = from num in numbers

                   where (num % 2) == 0

                   select num;

int evenNumCount = evenNumQuery.Count();

List<int> numQuery2 = (from num in numbers

                       where (num % 2) == 0

                       select num).ToList();

// or like this:

// numQuery3 is still an int[]

var numQuery3 = (from num in numbers

                where (num % 2) == 0

                select num).ToArray();

 

No comments:

Post a Comment