Kết nối

Ví dụ các câu truy vấn LINQ – Phần 1

76 lượt xem 
 Cập nhật lần cuối: 09/10/2023 lúc 19:03:44

Trong loạt bài viết này, bạn sẽ xem các ví dụ về truy vấn LINQ thì cấp độ dễ đến khó, hi vọng thông qua các ví dụ, bạn sẽ dễ hiểu hơn về truy vấn LINQ cũng như có hứng thú học. Mặc dù nỗ lực đưa ra các ví dụ mang tính thực tế, tuy nhiên chúng không thể bao quát hết được các vấn đề về truy vấn LINQ. Khi đó, bạn có thể gợi ý để chúng tôi có thể tiếp tục xây dựng các ví dụ ngày càng phong phú. Thêm nữa, mời bạn xem LINQ cơ bản nếu chưa biết gì về LINQ.

1. Lọc dữ liệu

Cho 1 danh sách các số nguyên, lọc ra số lớn hơn 10. Biến var là 1 dạng biến cho phép bạn lưu 1 danh sách các đối tượng.

var numbers = new List<int> { 5, 12, 8, 15, 3, 9 };
var result = numbers.Where(n => n > 10);

2. Phép chiếu (projection)

Phép chiếu (Projection) trong LINQ là quá trình chuyển đổi hoặc chọn các thành phần dữ liệu cụ thể từ tập nguồn để tạo tập kết quả mới với cấu trúc hoặc hình dạng khác. Phép chiếu cho phép bạn chỉ trích xuất dữ liệu cần chọn từ tập nguồn và định hình dữ liệu đó thành một dạng mới. Ví dụ, tạo một danh sách chỉ chứa tên người như sau:

var persons = new List<Person>
{
    new Person { Name = "Alice", Age = 25 },
    new Person { Name = "Bob", Age = 30 },
    new Person { Name = "Charlie", Age = 22 }
};
var names = persons.Select(p => p.Name);

3. Sắp xếp dữ liệu

Hàm OrderBy (tăng dần) và OrderByDescending (giảm dần) cho phép bạn sắp xếp dữ liệu theo thuộc tính bất kỳ. Nếu bạn muốn thêm 1 trường sắp xếp bạn có thể dùng hàm ThenBy.

List<Person> people = new List<Person>
        {
            new Person { FirstName = "John", LastName = "Doe" },
            new Person { FirstName = "Alice", LastName = "Smith" },
            new Person { FirstName = "Bob", LastName = "Johnson" },
            new Person { FirstName = "Alice", LastName = "Brown" }
        };

// Sắp xếp theo LastName và FirstName theo thứ tự tăng dần
        var sortedPeople = people.OrderBy(p => p.LastName).ThenBy(p => p.FirstName);

// Hiển thị kết quả
        foreach (var person in sortedPeople)
        {
            Console.WriteLine($"{person.LastName}, {person.FirstName}");
        }

4. Tổng hợp (Aggregation)

Sử dụng Sum() để cộng các giá trị trong danh sách số.

var numbers = new List<int> { 1, 2, 3, 4, 5 };
var sum = numbers.Sum();

5. Kết hợp dữ liệu (Joining Data)

Kết hợp 2 tập dữ liệu (bảng) với nhau bằng hàm Join, sau đó thực hiện truy vấn. Lưu ý các khóa của 2 tập dữ liệu khi Join phải có kiểu dữ liệu khớp nhau. Trong ví dụ dưới, kết hợp 2 tập theo chỉ số IdCustomerId.

var customers = new List<Customer>
{
    new Customer { Id = 1, Name = "Alice" },
    new Customer { Id = 2, Name = "Bob" }
};

var orders = new List<Order>
{
    new Order { CustomerId = 1, OrderId = 101 },
    new Order { CustomerId = 2, OrderId = 102 }
};

var customerOrders = customers.Join(orders,
    customer => customer.Id,
    order => order.CustomerId,
    (customer, order) => new
    {
        customer.Name,
        order.OrderId
    });

6. Gom nhóm (Grouping Data)

var products = new List<Product>
{
    new Product { Id = 1, Name = "Laptop", Category = "Electronics" },
    new Product { Id = 2, Name = "Shirt", Category = "Clothing" },
    new Product { Id = 3, Name = "TV", Category = "Electronics" }
};

var groupedProducts = products.GroupBy(p => p.Category);

7. Lọc với nhiều điều kiện (Filtering with Multiple Conditions)

Bạn có thể dùng && (và) hoặc || (hoặc) với hàm Where để lọc theo nhiều điền kiện.

var persons = new List<Person>
{
    new Person { Name = "Alice", Age = 25, IsStudent = true },
    new Person { Name = "Bob", Age = 30, IsStudent = false },
    new Person { Name = "Charlie", Age = 22, IsStudent = true }
};
var studentsUnder25 = persons.Where(p => p.IsStudent && p.Age < 25);

8. Phép chiếu phức tạp với các loại ẩn danh (Complex Projection with Anonymous Types)

Tạo 1 tập dữ liệu mới từ sự kết hợp của dữ liệu cũ:

var persons = new List<Person>
{
    new Person { Name = "Alice", Age = 25 },
    new Person { Name = "Bob", Age = 30 },
    new Person { Name = "Charlie", Age = 22 }
};

var projectedData = persons.Select(p => new
{
    FullName = $"{p.Name} ({p.Age} years old)",
    IsAdult = p.Age >= 18
});
// Kết quả của biến projectedData 
// 1. { FullName = "Alice (25 years old)", IsAdult = true }
// 2. { FullName = "Bob (30 years old)", IsAdult = true }
// 3. { FullName = "Charlie (22 years old)", IsAdult = true }

9. Sử dụng toán tử Distinct (Using the Distinct Operator)

Toán tử Distinct tương tự như truy vấn SQL được dùng để lọc ra các phần tử phân biệt, tức chỉ xuất hiện 1 lần duy nhất.

var numbers = new List<int> { 1, 2, 2, 3, 3, 4, 4, 5 };
var distinctNumbers = numbers.Distinct();
// Kết quả: 1, 2, 3, 4, 5

9. Kết hợp nhiều thao tác (Combining Multiple Operations)

Trong ví dụ sau, bạn lọc ra các số chẵn, sau đó sắp xếp giảm dần và tạo tập mới với mỗi số được nhân 2 từ số cũ.

var numbers = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
var result = numbers
    .Where(n => n % 2 == 0)   // Filter even numbers
    .OrderByDescending(n => n) // Sort in descending order
    .Select(n => n * 2);       // Double each number
// Kết quả: 20, 16, 12, 8, 4

Những ví dụ trên bao gồm một loạt các hoạt động truy vấn LINQ phổ biến, từ lọc đơn giản đến các kết hợp phức tạp hơn của lọc, chiếu, nhóm và kết nối. DAMMIO.COM chúc bạn học tốt và nhớ đón xem phần tiếp theo nhé!

Liên quan:  [LINQ và chuỗi] Phần 1: Đếm số lần xuất hiện của từ trong đoạn văn bản
Trích dẫn bài viết
  • APA:
    Dammio. (2023). Ví dụ các câu truy vấn LINQ – Phần 1. https://www.dammio.com/2023/10/08/vi-du-cac-cau-truy-van-linq-phan-1.
  • BibTeX:
    @misc{dammio,
    author = {Dammio},
    title = {Ví dụ các câu truy vấn LINQ – Phần 1},
    year = {2023},
    url = {https://www.dammio.com/2023/10/08/vi-du-cac-cau-truy-van-linq-phan-1},
    urldate = {2024-07-23}
    }
Theo dõi
Thông báo của
guest
1 Bình luận
Cũ nhất
Mới nhất Được bỏ phiếu nhiều nhất
Phản hồi nội tuyến
Xem tất cả bình luận
trackback

[…] bởi dammio 1 lượt xem    Thể loại: Chưa phân loại  << Bài trước Trang mục lục Bài tiếp theo […]

1
0
Rất thích suy nghĩ của bạn, hãy bình luận.x