LINQ là một tập hợp rộng rãi các công nghệ, dựa trên (ví dụ) một cú pháp hiểu truy vấn, ví dụ:
var qry = from x in source.Foo
where x.SomeProp == "abc"
select x.Bar;
được ánh xạ bởi trình biên dịch thành mã:
var qry = source.Foo.Where(x => x.SomeProp == "abc").Select(x => x.Bar);
và ở đây điều kỳ diệu thực sự bắt đầu. Lưu ý rằng chúng tôi chưa nói những gì Foo
ở đây - và trình biên dịch không quan tâm! Miễn là nó có thể giải quyết một số phương thức phù hợp được gọi là Where
có thể lấy lambda, và kết quả của việc đó có một số Select
phương thức có thể chấp nhận lambda, đó là điều hạnh phúc.
Bây giờ xem xét rằng lambda có thể được biên soạn hoặc vào một phương pháp vô danh (đại biểu, cho LINQ-to-Đối tượng, trong đó bao gồm LINQ-to-DataSet), hoặc để một biểu thức cây (một mô hình runtime đại diện cho lambda trong một mô hình đối tượng ).
Đối với dữ liệu trong bộ nhớ (thông thường IEnumerable<T>
), nó chỉ thực thi ủy quyền - tốt và nhanh chóng. Nhưng IQueryable<T>
đối với biểu diễn đối tượng của biểu thức (a LambdaExpression<...>
), nó có thể tách nó ra và áp dụng nó cho bất kỳ ví dụ "LINQ-to-Something" nào.
Đối với cơ sở dữ liệu (LINQ-to-SQL, LINQ-to-Entities), điều này có thể có nghĩa là viết TSQL, ví dụ:
SELECT x.Bar
FROM [SomeTable] x
WHERE x.SomeProp = @p1
Nhưng nó có thể (ví dụ: đối với Dịch vụ dữ liệu ADO.NET) có nghĩa là viết một truy vấn HTTP.
Việc thực thi một truy vấn TSQL được viết tốt trả về một lượng nhỏ dữ liệu sẽ nhanh hơn việc tải toàn bộ cơ sở dữ liệu qua mạng và sau đó lọc tại máy khách. Tuy nhiên, cả hai đều có kịch bản lý tưởng và kịch bản sai lầm.
Mục tiêu và lợi ích ở đây là cho phép bạn sử dụng một cú pháp duy nhất, được kiểm tra tĩnh để truy vấn nhiều nguồn dữ liệu và làm cho mã biểu cảm hơn (ví dụ: mã "truyền thống" để nhóm dữ liệu không rất rõ ràng về những gì nó đang cố gắng làm - nó bị mất trong khối lượng mã).