Trải nghiệm thử LINQ xem dư nào

Hiểu khái Niệm cơ bản về LINQ

LINQ - Language Integrated Query (tạm dịch là ngôn ngữ truy vấn tích hợp) - là cách thức truy vấn dữ liệu từ một tập hợp dữ liệu(hiểu nôm na là cách thức xử lý dữ liệu: query, find, sort, cast,..)

LINQ cung cấp cho chúng ta những providers khác nhau để có thể truy vấn đến những nguồn dữ liệu khác nhau. Dưới đây là bảng providers và giải thích:

image-29.png

Tên provider Mô tả
LINQ to Objects Sử dụng LINQ đối với các đối tượng collection mà implement từ IEnumerable hoặc IEnumerable (dữ liệu được lưu trong bộ nhớ). Được sử dụng rộng rãi đặc biệt đối với những bài toán cần hiệu năng cao.
LINQ to SQL Thực hiện map các tables, views, store procedures thành các đối tượng. LINQ sẽ thực hiện truy vấn trên các đối tượng đó bằng cách chuyển đổi qua lại giữa đối tượng và câu lệnh sql. Ngoài truy vấn ta cũng có thể thực hiện thêm/sửa/xóa dữ liệu dựa trên các đối tượng trên. Hỗ trợ transaction. Ưu điểm: được sử dụng khá nhiều trong thực tế dưới cái tên Entity Framework hoặc Entity Framework Core. Nhược điểm: chỉ làm việc với cơ sở dữ liệu là SQL Server.
LINQ to Entities Tương tự như LINQ to SQL nhưng hỗ trợ nhiều loại cơ sở dữ liệu.Nhược điểm: sử dụng phức tạp. Nhiều cơ sở dữ liệu không thích hợp sử dụng chung với .Net.
LINQ to DataSets Sự kết hợp giữa LINQ và ADO.NET.
LINQ to XML Truy vấn thông tin trong file XML.

LINQ API Có thể viết truy vấn LINQ cho các class implement IEnumerable or IQueryable interface. 2 class static Enumerable và Queryable có chứa các Extension Method viết truy vấn LINQ Untitled-design-4.png Ngoài ra còn có các API bên thứ 3 như LINQ to AMazon, LINQ to LDAP, PLINQ Những điều cần nhớ:

  • Sử dụng namespace System.Linq
  • LINQ QPI bao gồm 2 class static Enumerable and Queryable
  • class Enumerable static bao gồm các Extension Method cho các class implement interface IEnumerable, class Queryable static bao gồm các Extension Method cho các class implement interface IQueryable,
  • Kiểu IEnumerable là collection trong bộ nhớ như List, Dictionary<TKey, TValue>, SortedList<TKey, TValue>, Queue, Stack, Hashset

Cú pháp viết truy vấn LINQCó 2 cách cơ bản để viết truy vấn LINQ: Linq Query và Linq Method

Trong Linq thì có thể viết kết hợp Lambda Expression, Expression giúp code linh hoạt, gọn, dễ hiểu hơn.

Dưới đây là ví dụ về các toán tử truy vấn, Expression, Expression Tree , Lambda Expression, từ khóa Let|Into và các truy vấn LINQ phức tạp

Sự khác nhau giữa IEnumerable và IQueryable

| IEnumerable | IQueryable  | | ———– | ———– | | IEnumerable nằm trong namespace System.Collections | IQueryable nằm trong namespace System.Linq | | IEnumerable có thể duyệt cac phần tử chỉ 1 chiều tiến lên, nó không thể duyệt ngược lại giữa các phần tử.| IQueryable cũng chỉ có thể di chuyển 1 chiều tiến lên trong collection, nó không thể move back lại. | | IEnumerable tốt nhất khi truy vấn từ một collection in-memory tức là trong bộ nhớ RAM như List, Array… | IQueryable tốt nhất cho truy vấn dữ liệu out-memory như là database.| | Khi truy vấn dữ liệu từ database, IEnumerable thực thi câu lệnh select trên server sau đó tải toàn bộ dữ liệu về client rồi mới lọc dữ liệu. | Khi truy vấn, IQueryable thực thi câu lệnh truy vấn và lọc dữ liệu trên Server luôn| | IEnumerable phù hợp với Linq to Object và Linq to XML | IQueryable phù hợp cho Linq to SQL | | IEnumerable không hỗ trợ custom query | IQueryable hỗ trợ custom query sử dụng phương thức CreateQuery và Execute. | | IEnumerable không hỗ trợ lazy loading vì thế không phù hợp với trường hợp phân trang. | IQueryable hỗ trợ lazy loading. Vì thế nó phù hợp cho trường hợp phân trang.Ví dụ về IQueryable |

Ưu và nhược điểm của LINQ so với Stored Procedure

  • Stored Procedure and compiled SQL query có tốc độ thực thi nhanh nhất vì nó gần với dữ liệu trên CSDL nhất: mục tiêu chạy thật nhanh, nhưng tính mở rộng kém, khả năng bảo trì kém.
  • LINQ là thư viện cho phép truy vấn trên nhiều kiểu dữ liệu khác nhau: Object collections, XML, LINQ to SQL (truy vấn cơ sở dữ liệu MS-SQL), LINQ to Dataset, LINQ to Entity (ADO.net Entity Framework), LINQ to SharePoint, LINQ to XML, LINQ to nHIbernate, LINQ to XYZ, LINQ to Azure SQL Service….: một cú pháp lập trình chung–> tính mở rộng rất cao.
LINQ Stored Procedure
Compiled lại mỗi lần query Plan Excution dưới server và tận dụng full advantage of SQL features
Hỗ trợ Multiple Thread .NET Không thể chạy Multiple Thread
Cung cấp model query có thể dùng cho nhiều Database cùng 1 cú pháp Phải re-write nếu đổi Database
Dễ dàng debug, hỗ trợ IntelliSense khi code Có thể debug trên tool manager RDBMS nhưng vẫn nhằn hơn, ngoài ra có thể dùng cách check log hoặc print message
Hỗ trợ gen ra SQL statement ở mức cơ bản, không tốt với các statement phức tạp Viết các câu truy vấn SQL phức tạp
Chỉ một cú pháp lập trình chung–> tính mở rộng rất cao Thực thi nhanh, Giảm tải băng thông(thay vì gọi nhiều lần thì gom SQL lại thành 1 SP rồi call đúng 1 lần), Hỗ trợ cache
Khi desploy mọi thứ được compiled thành DLL, dễ dàng hơn. Cần cung cấp script để call
Không phải cách tốt khi dùng Bulk Insert hoặc Bulk Update: ảnh hướng tới hiệu suất do số lần truy cập vào máy chủ CSDL Thực thi luôn trên Server, có thể gửi data trên application dạng: string_split, xml, json, cast list thành many select, table value parameter
Sử dụng với bài toán cần check logic, testing, thay đổi bảo trì nhiều, phần cứng vẫn tải được Sử dụng với các bài toán cần truy vấn lưu trữ data lớn, đòi hỏi performance thì nên dùng store procedure để tận dụng thể mạnh của database