02/10/2018, 00:07

[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 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)​:

  1. 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);
  1. 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; }
}
  1. 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));
}
  1. 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 !

Tags: linq
0