- [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 hai
Tiếp theo của phần một - LINQ la gi ? - trong phần này sẽ giới thiệu các phương thức: Grouping, Set, Conversion (import) và Conversion (export).
- Ordering LINQ (sắp xếp):
- OrderByDescending: Sắp xếp các element theo thứ tự giảm dần theo khóa khai báo.
- ThenBy: Sắp xếp các element theo thứ tự tăng dần theo khóa khai báo, sau khi sắp xếp theo khóa trước đó.
var query = dsSach.OrderBy(x => x.MaChuDe).ThenBy(x => x.TenSach);
- ThenByDescending: Sắp xếp các element theo thứ tự giảm dần theo khóa khai báo, sau khi sắp xếp theo khóa trước đó.
- Reverse: Đảo ngược thứ tự sắp xếp các element trong sequence.
var query = dsSo.OrderBy(x => x).Reverse();
- Grouping LINQ (Nhóm):
- GroupBy: Nhóm các element theo một bộ khóa cụ thể:
var query = dsSach.GroupBy(x => x.MaChuDe)
.Select(x => new { x.Key, sosp = x.Count() });
//Cho biết số lượng sách của từng Chủ đề, gồm: Mã chủ đề, tên chủ đề, Số lượng
var query = dsSach.GroupBy(x => new { x.MaChuDe, x.ChuDe.TenChuDe })
.OrderBy(x => x.Key.MaChuDe)
.Select(x => new { x.Key.MaChuDe, x.Key.TenChuDe, soluong = x.Count() });
- Set LINQ (tập hợp):
- Concat: Nối 2 sequence lại. Phương thức này tương đương với UNION ALL trong SQL.
//Nối 2 chuỗi dsChuoi1 với dschuoi
List dsChuoi1 = new List(){"Đã mang lấy nghiệp vào thân","Cũng đừng trách lẫn trời gần trời xa."};
var query = dsChuoi1.Concat(dsChuoi);
- Union: Hội kết quả của 2 sequence và loại bỏ các element trùng lắp. P.thức này tương đương với UNION trong SQL.
//trả về kết quả chứa các số duy nhất của hai mảng
int[] dsSo2 = { 0, 2, 4, 5, 6, 8, 9 };
var query = dsSo.Union(dsSo2);
- Intersect: Hội kết quả của 2 sequence và chỉ lấy các element trùng lắp. Phương thức này tương đương với WHERE ... IN ... trong SQL.
//trả về kết quả chứa các số giống nhau của hai mảng
int[] dsSo2 = { 0, 2, 4, 5, 6, 8, 9 };
var query = dsSo.Intersect(dsSo2);
- Except: Hội kết quả của 2 sequence và chỉ lấy các element nào của sequence thứ nhất mà không có trong sequence thứ 2. Phươngthức này tương đương với EXCEPT hoặc WHERE ... NOT IN ... trong SQL.
//trả về kết quả chứa các số của mảng dsSo2 mà không có trong dsSo
int[] dsSo2 = { 0, 2, 4, 5, 6, 8, 9 };
var query = dsSo2.Except(dsSo);
- Conversion LINQ (import):
- OfType: Lọc các element kiểu IEnumerable thỏa điều kiện kiểu xác định. Nói cách khác là chuyển kiểu IEnumerable sang IEnumerable và sẽ không chuyển các element khác kiểu T
//Lọc các element có kiểu string
ArrayList ds = new ArrayList()
{
"Mango","Orange","Apple",3.0, "Banana", true, 100
};
IEnumerable query = ds.OfType();
- Cast: Chuyển kiểu các element kiểu IEnumerable sang kiểu xác định, tuy nhiên nó sẽ báo lỗi nếu không chuyển được vì có element sai kiểu.
//nếu dùng lại ví dụ trên
IEnumerable query = ds.Cast(); //Lỗi run-time
//nhưng nếu khai báo lại nguồn dữ liệu như sau thì sẽ không còn lỗi
ArrayList ds = new ArrayList()
{
"Mango","Orange","Apple", "Banana"
};
- Conversion LINQ (Export):
- ToArray: Tạo ra một mảng từ một IEnumerable.
//tạo một mảng từ kiểu List
var query = dssp.ToArray(); //Vừa tạo, vừa thi hành truy vấn
- ToList: Tạo ra một List từ một IEnumerable.
Sanpham[] dssp ={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ạo một List từ kiểu mảng Sanpham
var query = dssp.ToList();
//tạo một List từ kiểu mảng Sanpham
var query = dssp.Select(x => x.Tensp).ToList();
- ToDictionary: Tạo ra một Dictionary từ một IEnumerable dựa theo một bộkhóa xác định:
//tạo một Dictionary từ kiểu mảng
var spApple = (new[]{ new {Ten="iPhone",Dg=17}, new {Ten="iPad",Dg=10},new {Ten="iPod",Dg=2}, new {Ten="Mac laptop",Dg=25},
}).ToDictionary(x => x.Ten); //lấy Ten làm khóa, do đó nếu có giá trị trùng nhau thì sẽ bị lỗi run-time
- ToLookup: Tạo ra một Lookup từ một IEnumerable dựa theo một bộ khóa xác định. Điểm khác nhau so với ToDictionary là cho phép trùng Key:
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" }
};
//câu lệnh sẽ bị lỗi lúc run-time vì trùng khóa
var query = dssp.ToDictionary(x => x.Nhomsp);
//Dòng lệnh này sẽ không bị lỗi
var query = dssp.ToLookup(x => x.Nhomsp);
Ví dụ khác: Nhóm theo ký tự đầu tiên của thuộc tính Nhomsp
//Cũng có thể dùng ILookup và nhóm các element lại:
ILookup query = dssp.ToLookup(k => Convert.ToChar( k.Nhomsp.Substring(0,1)), v => v.Tensp);
StringBuilder stb = new StringBuilder();
//Khi thi hành truy vấn, dùng kiểu IGrouping
foreach (IGrouping q in query)
{
stb.AppendLine(q.Key.ToString());
foreach(string str in q )
stb.AppendLine(" " +str);
}
- AsEnumerable: Trả về input có kiểu IEnumerable.
IEnumerable query = dsChuoi.AsEnumerable().Where(x => x == "chữ");
- AsQueryable : Chuyển kiểu IEnumerable sang kiểu IQueryable.
IQueryable query = dsChuoi.AsQueryable().Where(x => x == "chữ");
Xem tiếp Phần ba !
HAPPY CODING :))