Cập nhật lần cuối: 29 tháng 10, 2025 bởi Aram
Trong bài viết này, bạn sẽ tìm hiểu về 2 thư viện tuyệt vời và mạnh mẽ để xử lý động các truy vấn LINQ cũng như thực thi, biên dịch và chạy mã C# tại thời điểm chạy.
Những thư viện này là Dynamic LINQ và C# Eval Expression.
Bài viết sẽ đi sâu vào từng thư viện này, với phần giới thiệu, các trường hợp sử dụng, cách sử dụng và một số ví dụ thực tế giúp khám phá khả năng của chúng tốt hơn.
Mục lục
Dynamic LINQ
Bạn đã bao giờ tự hỏi làm thế nào để xây dựng bộ lọc động trong LINQ mà không cần viết vô số câu lệnh if?
Đó là nơi Dynamic LINQ xuất hiện.
Dynamic LINQ là một thư viện miễn phí và mã nguồn mở. Được tải xuống hơn 254 triệu lần, thư viện này thêm các tiện ích mở rộng mạnh mẽ vào LINQ chuẩn.
Nó cho phép bạn xây dựng các truy vấn LINQ tại thời điểm chạy bằng cách sử dụng biểu thức chuỗi thay vì mã.
Cách Sử Dụng Dynamic LINQ?
Để sử dụng Dynamic LINQ, bạn cần cài đặt gói NuGet miễn phí:
System.Linq.Dynamic.Core
Và sau đó bạn có thể bắt đầu sử dụng nó dễ dàng như một phần của mã LINQ thông thường với một vài thay đổi:
using System.Linq.Dynamic.Core;
List<Product> products = [
new() { Name = "Laptop", Category = "Electronics", Price = 1200 },
new() { Name = "Phone", Category = "Electronics", Price = 800 },
new() { Name = "Desk", Category = "Furniture", Price = 300 },
];
// Dynamic filter, sort, and projection
var result = products
.AsQueryable()
.Where("Category == @0 && Price >= @1", "Electronics", 900)
.OrderBy("Price desc")
.Select("new (Name, Price)")
.ToDynamicList();
foreach (dynamic item in result)
Console.WriteLine($"{item.Name} - {item.Price}");
// Output: Laptop - 1200
Tính Năng Chính Của Dynamic LINQ
Truy Vấn Dựa Trên Chuỗi
Viết các truy vấn dưới dạng chuỗi, chẳng hạn như .Where("Age > 30"), cho phép xây dựng truy vấn động.
Phân Tích Biểu Thức
Sử dụng các phương thức như ParseLambda và Parse để chuyển đổi biểu thức chuỗi thành biểu thức LINQ có thể thực thi.
Tạo Lớp Động
Tạo các lớp dữ liệu mới tại thời điểm chạy bằng CreateClass, tạo điều kiện cho các tình huống khi cấu trúc dữ liệu không được biết tại thời điểm biên dịch.
var properties = new[] {
new DynamicProperty("Name", typeof(string)),
new DynamicProperty("Birthday", typeof(DateTime))
};
Type type = DynamicClassFactory.CreateType(properties);
var instance = Activator.CreateInstance(type);
type.GetProperty("Name").SetValue(instance, "Mozart");
type.GetProperty("Birthday").SetValue(instance, new DateTime(1756, 1, 27));
Xử Lý Null An Toàn
Xử lý các giá trị null một cách lịch sự với các hàm như np(), cho phép điều hướng an toàn qua các thuộc tính có thể null.
Tích Hợp Entity Framework
Tích hợp liền mạch với Entity Framework, hỗ trợ các thao tác như truy vấn Like và các phương thức không đồng bộ.
Các Trường Hợp Sử Dụng Dynamic LINQ
- Lọc & Sắp Xếp Theo Người Dùng: Xây dựng truy vấn linh hoạt từ đầu vào người dùng cho tìm kiếm, sắp xếp và lọc trên UI hoặc APIs.
- Báo Cáo & Phân Tích: Tạo báo cáo động, xuất dữ liệu và projections mà không thay đổi mã backend.
- Quản Trị & Vận Hành: Trao quyền cho admin truy vấn, làm sạch hoặc quản lý dữ liệu qua bộ lọc cấu hình tại thời điểm chạy.
- Logic Đa Người Dùng & Quy Tắc: Áp dụng các quy tắc lọc cụ thể cho tenant hoặc dựa trên cấu hình động.
- Công Cụ Phát Triển & Kiểm Thử: Chạy các truy vấn nhanh ad-hoc để debug, QA hoặc kiểm tra dữ liệu với cài đặt tối thiểu.
C# Eval Expression
Bạn có biết rằng bạn có thể thực thi mã C# động tại thời điểm chạy, giống như eval() của JavaScript, bằng thư viện C# Eval Expression?
C# Eval Expression cho phép bạn đánh giá biểu thức, thực thi câu lệnh hoặc thậm chí biên dịch và chạy các truy vấn LINQ động, tất cả mà không cần biên dịch mã trước.
Các Trường Hợp Sử Dụng C# Eval Expression
- Lọc Động: Xây dựng truy vấn tìm kiếm linh hoạt dựa trên bộ lọc do người dùng chọn.
- Công Cụ Tính Toán: Đánh giá các phép tính hoặc quy tắc kinh doanh do người dùng định nghĩa.
- Logic Dựa Trên Cấu Hình: Chạy các biểu thức C# được lưu trữ trong cấu hình cơ sở dữ liệu.
- Ánh Xạ Động: Chuyển đổi dữ liệu với các biểu thức được định nghĩa tại thời điểm chạy.
Cách Sử Dụng C# Eval Expression?
Để sử dụng C# Eval Expression, trước tiên bạn cần cài đặt gói NuGet Z.Expressions.Eval.
Các Phương Thức Chính Của C# Eval Expression
Execute
Phương thức execute mạnh mẽ và linh hoạt mà bạn có thể chạy bất kỳ biểu thức nào trong đó, đơn giản hoặc phức tạp.
using Z.Expressions;
var result = Eval.Execute<int>("int x = 5; x * 2;");
Console.WriteLine(result);
// Output: 10
Compile
Quá trình biên dịch liên quan đến việc phân tích và chuyển đổi một chuỗi biểu thức C# thành một delegate được biên dịch, có thể thực thi, tương tự như cách mã C# bình thường được biên dịch, nhưng được thực hiện tại thời điểm chạy.
string expression = "(x + y) * factor";
var compiled = Eval.Compile<Func<double, double, double, double>>(
expression, "x", "y", "factor"
);
double result1 = compiled(100, 50, 2);
double result2 = compiled(200, 25, 3);
Chạy Dynamic LINQ
Các tính năng tương tự của thư viện Dynamic LINQ được tích hợp trong thư viện C# Eval Expression nhưng với phong cách khác và kiểm soát nhiều hơn.
C# Eval Expression EvalContext
EvalContext là một tính năng cốt lõi và lớp chính trong thư viện C# Eval Expression. Nó cung cấp cho bạn quyền kiểm soát và cô lập khi thực thi mã C# động.
Global Context
Ngữ cảnh toàn cục là ngữ cảnh tĩnh mặc định được sử dụng đằng sau hậu trường bất cứ khi nào bạn gọi lớp Eval trực tiếp.
Instance Context
Đây là nơi bạn có thể tạo phiên bản riêng của EvalContext và định nghĩa các tham số của riêng bạn trong đó.
var context = new EvalContext();
context.RegisterLocalVariable("discount", 0.10);
var result = context.Execute<double>(
"price * (1 - discount)",
new { price = 100.0 }
);
// Output: 90.0
Suy Nghĩ Cuối Cùng
Dynamic LINQ và C# Eval Expressions đều cho phép bạn đánh giá logic tại thời điểm chạy, nhưng chúng phục vụ các mục đích hơi khác nhau.
- Dynamic LINQ tuyệt vời để xây dựng các biểu thức truy vấn động, đặc biệt khi lọc hoặc sắp xếp dữ liệu trong cơ sở dữ liệu hoặc collection dựa trên đầu vào người dùng.
- C# Eval Expressions xuất sắc trong việc thực thi các biểu thức C# tùy ý với đầy đủ toán học, hàm và logic tại thời điểm chạy, lý tưởng cho công cụ tính giá, công thức có thể cấu hình hoặc quy tắc kinh doanh.
Kết hợp với nhau, chúng cung cấp cho bạn sự linh hoạt để thích ứng mã của bạn động mà không cần triển khai lại, đồng thời giữ cho ứng dụng cốt lõi của bạn sạch sẽ và dễ bảo trì.
Việc lựa chọn giữa chúng phụ thuộc vào việc bạn chỉ cần tính linh hoạt của truy vấn (Dynamic LINQ) hay cần đánh giá biểu thức toàn diện cho mã C# của bạn tại thời điểm chạy (C# Eval Expression).
Tài Liệu Tham Khảo
Bài viết này chỉ thể hiện phần nổi của tảng băng cho cả hai thư viện Dynamic LINQ và C# Eval Expression. Có rất nhiều điều để khám phá trong những công cụ tuyệt vời này.



