So sánh IEnumerable và IQueryable trong C#

So sánh IEnumerable và IQueryable trong C#

January 20, 2025 0 By Nam Vu

Trong .NET, đây là một câu hỏi thường hay gặp khi phỏng vấn, So sánh IEnumerableIQueryable.

Thực tế là hai interface rất quan trọng khi làm việc với dữ liệu. Tuy nhiên, chúng khác nhau về cách xử lý dữ liệu, ảnh hưởng trực tiếp đến hiệu suất ứng dụng.

Dưới đây là sự so sánh chi tiết giữa hai interface này.

Về khái niệm

  1. IEnumerable
  • Được định nghĩa trong namespace System.Collections.
  • Làm việc với dữ liệu trong bộ nhớ (in-memory).
  • Dùng để lặp qua các phần tử của một tập hợp.
  • Thường được sử dụng với các tập hợp như List, Array.
  1. IQueryable
  • Được định nghĩa trong namespace System.Linq.
  • Làm việc với dữ liệu từ nguồn bên ngoài như database hoặc dịch vụ web.
  • Dùng để xây dựng các truy vấn LINQ (Language Integrated Query) tối ưu.
  • Thường được sử dụng với Entity Framework hoặc các ORM (Object Relational Mapper).

Về Cách Thức Hoạt Động

  1. IEnumerable
  • Lọc dữ liệu trên client: Toàn bộ dữ liệu được tải vào bộ nhớ trước khi áp dụng bộ lọc.
  • Ví dụ:
var numbers = dbContext.Numbers.AsEnumerable()
              .Where(n => n > 5); // Lọc trên client

Trong ví dụ này, tất cả bản ghi sẽ được tải từ database về client trước khi áp dụng bộ lọc.

  1. IQueryable
  • Lọc dữ liệu tại database: Chỉ những dữ liệu cần thiết được truy vấn trực tiếp từ nguồn.
  • Ví dụ:
var numbers = dbContext.Numbers.AsQueryable()
              .Where(n => n > 5); // Lọc trên database

Ở đây, câu lệnh SQL tương ứng sẽ được tạo và gửi đến database để thực hiện truy vấn.

Về Hiệu Suất

  1. IEnumerable
  • Chậm hơn khi làm việc với dữ liệu lớn do toàn bộ dữ liệu phải được tải về trước.
  • Tốn nhiều bộ nhớ nếu dữ liệu lớn.
  • Phù hợp cho các tập dữ liệu nhỏ trong bộ nhớ.
  1. IQueryable
  • Tối ưu hơn khi làm việc với dữ liệu lớn vì truy vấn được thực thi tại database.
  • Tiết kiệm băng thông do chỉ tải dữ liệu cần thiết.
  • Phù hợp khi làm việc với nguồn dữ liệu từ xa như SQL Server, MongoDB.

Về Thời Điểm Thực Thi

  1. IEnumerable
  • Truy vấn được thực thi ngay lập tức (immediate execution).
  • Ví dụ:
var list = dbContext.Numbers.ToList(); // Thực thi ngay lập tức
  1. IQueryable
  • Truy vấn được thực thi trì hoãn (deferred execution) cho đến khi dữ liệu thực sự được sử dụng.
  • Ví dụ:
var query = dbContext.Numbers.Where(n => n > 5); // Chưa thực thi
var result = query.ToList(); // Thực thi tại đây

Vậy Khi Nào Sử Dụng

  1. IEnumerable:
  • Khi bạn làm việc với dữ liệu đã tải vào bộ nhớ.
  • Khi tập dữ liệu nhỏ và không yêu cầu hiệu suất cao.
  1. IQueryable:
  • Khi bạn cần tối ưu hóa truy vấn và chỉ tải dữ liệu cần thiết.
  • Khi làm việc với database hoặc các nguồn dữ liệu từ xa.

Hi vọng với bài viết này có thể giúp bạn một vài gợi ý trong câu trả lời phỏng vấn

#ntechdevelopers