- [DEVEXPRESS] Chia sẻ source code cách tạo biểu đồ sơ đồ tổ chức công ty Org Chart trên Winform C#
- [C#] Hướng dẫn tạo Auto Number trên Datagridview winform
- [DATABASE] Hướng dẫn tạo Procedure String Split in Mysql
- [C#] Thiết lập dấu (,) hay dấu (.) ở định dạng số đúng với định dạng số Việt Nam
- [C#] Chia sẻ source code Game Spin Lucky Wheel
- [C#] Hướng dẫn Encode and Decode HTML
- Danh sách tài khoản ChatGPT miễn phí - Hướng dẫn tạo tài khoản Chat Open AI GPT tại Việt Nam
- [C#] Hướng dẫn thay đổi giao diện ứng dụng Winform theo giao diện của Windows
- [VB.NET] Hiệu ứng Acrylic, Mica, Tabbed Blur Effect trên Winform
- [DEVEXPRESS] Hướng dẫn sử dụng HTML Template trên Combobox Edit
- [C#] Chia sẻ source code Orange Rain in Winform
- [DEVEXPRESS] Hướng dẫn sử dụng HTML Template trên XtraMessageBox Winform Devexpress 22.2.3
- [DEVEXPRESS] Hướng dẫn sử dụng HTML and CSS Code Viewer trên Winform
- [C#] Number Effect Counter up and down in winform
- [C#] Hướng dẫn Supend and Resume Process ID in Winform
- [C#] Hiển thị line number trên Richtextbox Winform
- [C#] Fake Blue Screen BSOD in winform
- [C#] Chia sẽ code demo sử dụng Async Parallel Foreach and For in Winform
- [C#] Sử dụng ActionBlock run X task at time winform
- [C#] Hướng dẫn sử dụng Property Grid để lưu và tải lại thông tin cấu hình user trên 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 !