Trong khi viết các câu truy vấn an toàn kiểu là tốt nhất trong hầu hết trường hợp, trong một số trường hợp khác, bạn vẫn muốn xây dựng các câu truy vấn động một cách tùy biến hơn. Ví dụ: bạn có thể muốn cung cấp các tính năng business intelligence trong ứng dụng cho phép người dùng có thể dùng các tùy chọn để xây dựng nên câu truy vấn riêng.
Với những trường hợp như vậy, trước đây người ta thường dùng phép nối chuỗi để tạo nên các câu SQL. Gần đây một số người thường hỏi tôi về cách xử lý các trường hợp như vậy trong LINQ. Bài viết dưới đây sẽ mô tả cách bạn có thể dùng Dynamic LINQ được cung cấp bởi nhóm LINQ để xây dựng động các câu truy vấn.
Tải về thư viện LINQ Dynamic Query
Bao gồm trên trang tải về các ví dụ mẫu trong VS 2008 là các con trỏ đến các gói chương trình mẫu VB và C#, trong đó có cả một thư viện trợ giúp dynamic query LINQ. Bạn có thể truy cập trực tiếp đến thư viện này (và cả tài liệu) thông qua các đường link sau:
- VB Dynamic Query Library (included in the \Language Samples\LINQ Samples\DynamicQuery directory)
- C# Dynamic Query Library (included in the \LinqSamples\DynamicQuery directory)
Cả các ví dụ DynamicQuery VB và C# đều bao gồm mã nguồn của thư viện trợ giúp cho phép bạn xây dựng các câu truy vấn dùng các phương thức mở rộng cho phép nhận vào các chuỗi tham số thay vì các toán tử an toàn kiểu. Bạn có thể cắt/dán mã lện VB hoặc C# của thư viện DynamicQuery vào trong dự án riêng của bạn và dùng nó ở chỗ thích hợp để có thể xây dựng các câu truy vấn LINQ một cách động hơn dựa trên dữ liệu đầu vào của người dùng.
Ví dụ về Dynamic Query Library
Bạn có thể dùng thư viện DynamicQuery cùng với bất kỳ LINQ data provider (bao gồm LINQ to SQL, LINQ to Objects, LINQ to XML, LINQ to Entities, LINQ to SharePoint, LINQ to TerraServer, …). Thay vì dùng các toán tử của ngôn ngữ hay các phương thức mở rộng để xây dựng các câu truy vấn LINQ, thư viện DynamicQuery cung cấp cho bạn các phương thức mở rộng dựa trên các chuỗi để bạn có thể chuyển bất kỳ chuỗi biểu thức nào vào.
Trong ví dụ sau có một câu truy vấn LINQ to SQL chuẩn mà nó lấy dữ liệu từ CSDL Northwind và hiển thị trong một control ASP.NET GridView:
Dùng thư viện LINQ DynamicQuery, tôi có thể viết lại câu truy vấn ở trên như sau:
Chú ý cách viết biểu thức điều kiện trong where và mệnh đề order by, thay vì viết các mã lệnh thì viết sẽ dùng các biểu thức chuỗi. Bởi vì các chuỗi này chỉ được gắn nối về sau nên tôi có thể xây dựng động nó, ví dụ tôi có thể xây dựng một giao diện cho phép người dùng chọn lựa các thành phần và giá trị để xây dựng nên một câu truy vấn riêng.
Tài liệu thư viện Dynamic Query
Bao gồm trong các ứng dụng mẫu Dynamic Query C# và VB trên là một số tài liệu HTML mô tả cách dùng các phương thức mở rộng Dynamic LINQ một cách chi tiết. Nó rất có giá trị nếu bạn muốn thao khảo sâu hơn về thư viện này:
Tải về và chạy một ứng dụng mẫu Dynamic Query
Bạn có thể tải về và chạy các ứng dụng VB và C# mẫu biểu diễn cách dùng Dynamic LINQ trong một web site ASP.NET để truy vấn CSDL Northwind dùng LINQ to SQL:
Bạn có thể dùng Visual Web Developer 2008 Express (miễn phí) hay VS 2008 để mở và chạy chúng.
Những cách tiếp cận khác để xây dựng các câu truy vấn LINQ động
Dùng Dynamic LINQ tương đối đơn giản và dễ dùng, và nó đặc biệt hữu ích trong trường hợp các câu truy vấn hoàn toàn động và bạn muốn cung cấp giao diện cho người dùng tự xây dựng chúng.
Trong một bài viết khác, tôi sẽ đào sâu hơn vào việc xây dựng các câu truy vấn động trong LINQ, và thảo luận về các cách tiếp cận khác mà bạn có thể dùng để xây dựng nên mã lệnh bằng cách sử dụng các phương thức an toàn kiểu (Joseph và Ben Albahari, các tác giả của cuốn sách C# 3.0 In a Nutshell, có một bài viết hay về vấn đề này tại đây).
Theo blog ScottGu
– Bữa giờ loay hoay đọc lung tung trên mạng để tìm cách làm sao chuyển các store trong SQL thành kiểu viết LINQ, nhưng không có kết quả.
– Vô tình đọc bài viết “Sử dụng thư viện LINQ Dynamic Query” của a Hảii Nam đã gỡ bỏ gút mắt.
Thanks anh nhiều lắm.
Cho mình hỏi làm sao để kết được 2 bảng?
vd: bảng BaiHat có thuộc tính maCaSi
mình muốn kết với bảng CaSi để lấy tenCaSi, bind lên gridview
em cảm ơn anh ah. bai nay dễ hiểu lắm ạ,anh ơi,pót thêm nhiêu bai hay như vậy nữa nha anh..hihi
Thank you
sao khi em add cai DynamicLinq vao no bao lỗi tùm lum vậy nhỉ?