[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, ...
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 !