- [SQLSERVER] Loại bỏ Restricted User trên database MSSQL
- [C#] Hướng dẫn tạo mã QRcode Style trên winform
- [C#] Hướng dẫn sử dụng temp mail service api trên winform
- [C#] Hướng dẫn tạo mã thanh toán VietQR Pay không sử dụng API trên winform
- [C#] Hướng Dẫn Tạo Windows Service Đơn Giản Bằng Topshelf
- [C#] Chia sẻ source code đọc dữ liệu từ Google Sheet trên winform
- [C#] Chia sẻ source code tạo mã QR MOMO đa năng Winform
- [C#] Chia sẻ source code phần mềm lên lịch tự động chạy ứng dụng Scheduler Task Winform
- [Phần mềm] Tải và cài đặt phần mềm Sublime Text 4180 full version
- [C#] Hướng dẫn download file từ Minio Server Winform
- [C#] Hướng dẫn đăng nhập zalo login sử dụng API v4 trên winform
- [SOFTWARE] Phần mềm gởi tin nhắn Zalo Marketing Pro giá rẻ mềm nhất thị trường
- [C#] Việt hóa Text Button trên MessageBox Dialog Winform
- [DEVEXPRESS] Chia sẻ code các tạo report in nhiều hóa đơn trên XtraReport C#
- [POWER AUTOMATE] Hướng dẫn gởi tin nhắn zalo từ file Excel - No code
- [C#] Chia sẻ code lock và unlock user trong domain Window
- [DEVEXPRESS] Vẽ Biểu Đồ Stock Chứng Khoán - Công Cụ Thiết Yếu Cho Nhà Đầu Tư trên Winform
- [C#] Hướng dẫn bảo mật ứng dụng 2FA (Multi-factor Authentication) trên Winform
- [C#] Hướng dẫn convert HTML code sang PDF File trên NetCore 7 Winform
- [C#] Hướng dẫn viết ứng dụng chat với Gemini AI Google Winform
[C#] LINQ trong CSharp - Phần một
LINQ là gì ? LINQ là viết tắt của cụm từ Language - Integrated Query. Tạm dịch là Ngôn ngữ có tích hợp truy vấn. Là một tập hợp các từ khóa trong C# và VB.Net, được dùng để truy vấn các nguồn dữ liệu khác nhau. Nói cách khác, với cùng một cú pháp trong LINQ, ta có thể truy vấn đến nhiều nguồn dữ liệu khác nhau như: object, XML, SQL, v.v... Đồng thời có thể dùng các phương thức sắp xếp, chọn lọc, gộp nhóm,... rất dễ dàng.
I. Đặc điểm:
- LINQ đơn giản hóa việc truy vấn dữ liệu.
- Các biến LINQ query thường được khai báo có kiểu là IEnumerable và IQueryable
- Khi kiểu dữ liệu trả về chưa được định nghĩa (kiểu vô danh), vẫn có thể sử dụng từ khóa var để thay thế biến kiểu generic.
II. Các phương thức mở rộng hỗ trợ LINQ (căn bản):
- Filtering LINQ (lọc):
- Where: Lọc dữ liệu trong tập hợp dựa trên điều kiện cụ thể:
int[] dsSo = { 5, 4, 1, 3, 9, 4, 6, 5, 2, 1 };
List dsChuoi = new List{"Thiện", "căn", "ở", "tại", "lòng", "ta", "chữ","Tâm", "kia", "mới", "bằng", "ba", "chữ","Tài" };
//lọc các số chẵn trong dsSo
IEnumerable query = dsSo.Where(x => x % 2 == 0);
//Lọc các chuỗi có chiều dài >=4
IEnumerable query=dsChuoi.Where(x => x.Length>= 4);
- Distinct: Trả về các element riêng biệt (không trùng) từ một sequence:
//Lọc các số duy nhất trong dsSo
IEnumerable query = dsSo.Distinct();
//Đếm có bao nhiêu chuỗi không trùng nhau
int so = dsChuoi.Distinct().Count();
- Take: Trả về con số element (số dòng) cụ thể liên tục liền kề tính từ vị trí bắt bắt đầu của sequence:
//lấy 6 chuỗi đầu tiên trong dschuoi
IEnumerable query = dsChuoi.Take(6);
- TakeWhile: Trả về con số element của tập hợp thỏa mãn điều kiện cụ thể:
Lưu ý: p.thức này thường dùng với hành động sắp xếp trước đó.
//lấy những chuỗi đầu tiên có chứa ký tự n
IEnumerable query= dsChuoi.TakeWhile(x => x.Contains('n'));
- Skip: Bỏ qua số element xác định và trả về số element còn lại trong sequence:
Lưu ý: trong LINQ to Entities, Skip thường kết hợp với Take để phân trang dữ liệu (Data Paging).
//Bỏ qua 6 element chuỗi đầu tiên
var query = dsChuoi.Skip(6);
//Bỏ qua 6 element chuỗi đầu tiên và chỉ lấy 3 element tiếp theo
var query = dsChuoi.Skip(6).Take(3);
- SkipWhile: Bỏ qua số element thỏa mãn điều kiện xác định và trả về số element còn lại trong sequence:
Lưu ý: p.thức này thường dùng với hành động sắp xếp trước đó.
//Sắp dsSo giảm dần, sau đó chỉ lấy các element < 5
var query = dsSo.OrderByDescending(x => x).SkipWhile(x => x >= 5);
- Projecting LINQ (phép chiếu):
- Select: Chọn các thuộc tính của element để tạo ra một kiểu mới:
//Liệt kê các element trong dsSo và tạo ra kiểu string
IEnumerable query = dsSo.Select(x => "Số : " + x.ToString());
//kết hợp với chỉ số của element tạo ra kiểu vô danh
var query = dsChuoi.Select((x, i) => new { chiso = i, giatri = x });
- SelectMany: Chọn các thuộc tính của element để tạo ra kiểu IEnumerable và chuyển các kết quả sequence thành một sequence:
ConNguoi[] dsNhanvien ={ new ConNguoi{ Hoten="Nhung", Dienthoai = new List{"0909047213", "38221568" } },new ConNguoi{ Hoten="Đoan", Dienthoai = new List{"0909047213", "38221568" } },new ConNguoi{ Hoten="Hoa", Dienthoai = new List{"0909047213", "38221568" } }
};
IEnumerable query = dsNhanvien.SelectMany(x => x.Dienthoai);
//hoặc
var query=dsNhanvien.SelectMany(x => x.Dienthoai.Select(y=> new{x.Hoten, y}));
//Lớp hỗ trợ ví dụ
class ConNguoi
{
public string Hoten { get; set; }
public List Dienthoai { get; set; }
}
- Joining LINQ (kết nối):
- Join: Kết hợp các element của 2 sequence dựa trên khóa tương xứng:
string[] nhomsp = new string[]{"Rượu bia", "Ngũ cốc","Rau cải","Sữa","Hải sản"};
List dssp = new List {
new Sanpham { Tensp = "Xà lách", Nhomsp="Rau cải" },new Sanpham { Tensp = "Cua biển", Nhomsp="Hải sản" },new Sanpham { Tensp = "Đậu xanh", Nhomsp="Ngũ cốc" } ,new Sanpham { Tensp = "Tôm càng", Nhomsp="Hải sản" }
};
//Tìm các element giống nhau từ 2 tập hợp, tạo ra một tập kết quả tương đương.
//còn gọi là liên kết tương đương
var query = nhomsp //outer collection
.Join(dssp, //inner collection
keyo => keyo, //outer key selector
keyi => keyi.Nhomsp, //inner key selector
(o, i) => new { o, i });//result selector
//Class hỗ trợ
class Sanpham
{
public string Tensp { get; set; }
public string Nhomsp { get; set; }
}
//Ghi chú: Trong LINQ to Entities, Join thường sử dụng với bài toán thống kê, xem trong Average
- GroupJoin: Kết hợp các element của 2 sequence dựa trên khóa tương đương và nhóm lại thành một kết quả. Tương đương với cú pháp Query syntax là join ... into.
var query = nhomsp //outer collection
.GroupJoin(dssp, //inner collection
keyo => keyo, //outer key selector
keyi => keyi.Nhomsp, //inner key selector
(o, i) => new { Tenhom=o, tensp= i.Select(x => x.Tensp) });//result selector
StringBuilder stb = new StringBuilder();
foreach (var n in query)
{
stb.AppendLine(string.Format("{0}", n.Tenhom));
foreach (string t in n.tensp)
stb.AppendLine(string.Format(" {0}", t));
}
- Ordering LINQ (sắp xếp):
- OrderBy: Sắp xếp các element theo thứ tự tăng dần theo khóa khai báo:
var query = dsChuoi.OrderBy(x => x);
//không phân biệt chữ Hoa/thường
var query = dsChuoi.OrderBy(x => x, StringComparer.CurrentCultureIgnoreCase);
Xem tiếp Phần hai !