Trong LINQ to SQL, các phương thức xử lý tập hợp giúp thao tác dữ liệu từ nhiều nguồn một cách linh hoạt. Dưới đây là các kỹ thuật phổ biến để kết hợp và lọc dữ liệu.
1. Phương thức Union – Hợp của hai tập hợp (loại bỏ trùng lặp)
Phương thức Union trả về tất cả phần tử duy nhất xuất hiện trong ít nhất một trong hai tập hợp, tự động loại bỏ các giá trị trùng nhau – tương tự lệnh UNION trong SQL.
var countries = (from customer in dataContext.Customers
select customer.Country)
.Union(from employee in dataContext.Employees
select employee.Country);
Một cách tiếp cận khác là sử dụng các truy vấn riêng biệt:
var queryA = from student in dataContext.Students
where student.Id < 3
select student;
var queryB = from student in dataContext.Students
where student.Id < 5
select student;
// Kết hợp và loại bỏ bản ghi trùng
var uniqueStudents = queryA.Union(queryB).ToList();
Lưu ý: LINQ không hỗ trợ trực tiếp UNION ALL, nhưng có thể dùng Concat để đạt hiệu ứng tương tự mà không loại bỏ trùng.
var allStudents = queryA.Concat(queryB).ToList(); // Giữ lại tất cả bản ghi, kể cả trùng
2. Phương thức Intersect – Giao của hai tập hợp
Intersect trả về các phần tử chung giữa hai tập hợp. Ví dụ dưới đây lấy ra các độ tuổi xuất hiện cả ở bảng Khách hàng và Nhân viên:
var commonAges = (from customer in dataContext.Customers
select customer.Age)
.Intersect(from employee in dataContext.Employees
select employee.Age);
3. Phương thức Except – Hiệu của hai tập hợp
Except trả về các phần tử chỉ tồn tại trong tập hợp đầu tiên mà không có trong tập hợp thứ hai.
var customerNamesOnly = (from customer in dataContext.Customers
select customer.Name)
.Except(from employee in dataContext.Employees
select employee.Name);
Ví dụ với dữ liệu sinh viên:
var set1 = from s in dataContext.Students where s.Id < 3 select s; // Id: 1, 2
var set2 = from s in dataContext.Students where s.Id < 5 select s; // Id: 1, 2, 3, 4
var diff1 = set1.Except(set2).ToList(); // Kết quả: rỗng (vì 1,2 đều thuộc set2)
var diff2 = set2.Except(set1).ToList(); // Kết quả: 3, 4
4. Phương thức Distinct – Lọc phần tử trùng trong cùng một tập
Distinct được dùng để loại bỏ các phần tử trùng lặp trong một chuỗi đơn lẻ.
List<int> numbers = new List<int> { 1, 2, 3, 3, 3 };
var uniqueNumbers = numbers.Distinct().ToList(); // Kết quả: [1, 2, 3]
Phương thức này hữu ích khi cần làm sạch dữ liệu đầu ra trước khi hiển thị hoặc xử lý tiếp.