SubSonic do Rob Conery viết cách đây từ năm 2007 dựa trên pattern Active Record. nHibernate cũng tương tự. Hai thư viện này đều được gọi là ORM, Object Relation Mapping. Mình từng thử học nHibernate thấy nó khá loằng ngoằng vì phải dùng file XML để ánh xạ bảng, hoặc kết nối bảng của CSDL với các đối tượng tập collection trong .NET.
Ngược lại SubSonic thì đơn giản hơn, nó có một tool quét tất cả các bảng, stored procedure trong CSDL chủ yếu ở đây là SQL 2005 trở lên, Oracle cũng hỗ trợ nhưng mình chưa thử. Sau có thông tin đầy đủ về tên bảng, tên cột, kiểu dữ liệu của cột thì SubSonic sẽ sinh mã C# định nghĩa các collection chứa class, trong class có các trường thành viên tương ứng với cột. SubSonic có thể mô tả được cả quan hệ một-nhiều. NHibernate cũng vậy.
Đối với stored procedure, thì SubSonic sinh mã là các hàm static. Khi lập trình viên CSDL thay đổi cấu trúc bảng, sửa, thêm mới stored procedure thì tool command line của SubSonic cần chạy lại để cập nhật ánh xạ. Ngoài ra lập trình viên có thể sử dụng partial class để thêm mới các method cho các class tương ứng với bảng trong CSDL. Mình rất thích tính năng này của SubSonic bởi không phải lo truyền sai tham số vào stored procedure.
Về tốc độ, mình nghĩ SubSonic và nHibernate không khác nhau nhiều. Nhưng về dễ sử dụng thì mình thích SubSonic hơn.
LINQ thì có nhiều điểm cải tiến hơn là ORM thuần tuý. LINQ có thể truy vấn cho .NET collection, XML, và SQL,… Căn bản bên trong của LINQ tận dụng những cú pháp mới trong C# 3.0:
- Hàm mở rộng, extension method, gắn hàm mới vào đối tượng kể cả kiểu cơ bản như int mà không cần định nghĩa hàm thừa kế. Hàm này phải khai báo là pubic static nhé
- Biểu thức Lamba, lambda expression, cách viết mới của delegate inline function.
Tốc độ thì cả 3 công nghệ trên khi đo đạc cá nhân sử dụng kiến trúc client-server đều không thể nhanh bằng viết lời gọi đến stored procedure. Tuy nhiên, khả năng mở rộng, phân tán các tập đối tượng, objection collection giữa các máy tính trong kiến trúc SOA rõ ràng là dễ dàng hơn so với Client Server ngày xưa.
Hơn nữa khi nói đến tốc độ, chúng ta phải bàn đến cả khả năng chịu tải truy cập, load balancing & scalability. Một câu lệnh SQL chạy rất nhanh khi chỉ có duy nhất yêu cầu query thì chưa chắc đã đủ. Thực tế nhiều khi là hàng nghìn yêu cầu query đến cùng một lúc. Lúc này, cần phải tính tới phân tải database server hoặc cache dữ liệu trên nhiều application logic tier trung gian. Khi đó LINQ hay ActiveRecord sẽ phát huy sở trưởng của mình.
Với LINQ chỉ cần học một cú pháp, có thể truy vấn nhiều nguồn dữ liệu khác nhau. Chúng ta có thể mở rộng cả cú pháp LINQ viết thêm các hàm deffered và non differed function mới khi chúng ta có kinh nghiệm với hàm mở rộng và biểu thức lamba. Riêng cái này thì ANSI SQL bó tay rồi.
Nguồn bài viết:
Dngaz.com