LINQ là gì và nó làm gì? [đóng cửa]


126

LINQ là gì? Tôi biết nó cho cơ sở dữ liệu, nhưng nó làm gì?


20
Tôi tin rằng tôi đã đánh bại tiêu chí "không thể trả lời hợp lý". Không có lý do gì câu hỏi này nên được đóng lại.
Amy B

1
Hãy lắng nghe người tạo ra LINQ, Erik Meijer, nói nó là gì. BTW, nó không dành cho cơ sở dữ liệu một mình.
Sнаđошƒаӽ

Câu trả lời:


171

LINQ là viết tắt của Ngôn ngữ truy vấn tích hợp .

Thay vì viết YAQL (Ngôn ngữ truy vấn khác), các nhà phát triển ngôn ngữ Microsoft đã cung cấp cách thể hiện truy vấn trực tiếp bằng ngôn ngữ của họ (chẳng hạn như C # và Visual Basic). Các kỹ thuật hình thành các truy vấn này không dựa vào chi tiết triển khai của điều được truy vấn, để bạn có thể viết các truy vấn hợp lệ đối với nhiều mục tiêu (cơ sở dữ liệu, đối tượng trong bộ nhớ, XML) mà thực tế không xem xét cách thức cơ bản trong đó truy vấn sẽ được thực hiện.

Hãy bắt đầu khám phá này với các phần thuộc về .NET Framework (3.5).

  • LINQ To Object - kiểm tra System.Linq.Enumerable cho các phương thức truy vấn. Những mục tiêu này IEnumerable<T>, cho phép bất kỳ bộ sưu tập có thể lặp được gõ nào được truy vấn theo cách an toàn kiểu. Các truy vấn này dựa trên các phương thức .NET được biên dịch, không phải biểu thức.

  • LINQ To Anything - kiểm tra System.Linq.Queryable để biết một số phương thức truy vấn. Các mục tiêu này IQueryable<T>, cho phép xây dựng Cây biểu hiện có thể được dịch bằng cách triển khai cơ bản.

  • Cây biểu thức - kiểm tra không gian tên System.Linq.Expressions . Đây là mã dưới dạng dữ liệu. Trong thực tế, bạn nên biết về những thứ này, nhưng không thực sự cần phải viết mã chống lại các loại này. Các tính năng ngôn ngữ (như biểu thức lambda) có thể cho phép bạn sử dụng nhiều loại tay ngắn khác nhau để tránh giao dịch trực tiếp với các loại này.

  • LINQ To SQL - kiểm tra không gian tên System.Data.Linq . Đặc biệt lưu ý các DataContext. Đây là công nghệ DataAccess được xây dựng bởi nhóm C #. Nó chỉ hoạt động.

  • LINQ To Entities - kiểm tra không gian tên System.Data.Objects . Đặc biệt lưu ý các ObjectContext. Đây là công nghệ DataAccess được xây dựng bởi nhóm ADO.NET. Nó phức tạp, mạnh mẽ và khó sử dụng hơn LINQ To SQL.

  • LINQ To XML - kiểm tra không gian tên System.Xml.Linq . Về cơ bản, mọi người không hài lòng với những thứ trong System.Xml. Vì vậy, Microsoft đã viết lại nó và tận dụng việc viết lại để giới thiệu một số phương pháp giúp sử dụng LINQ To Object dễ dàng hơn đối với XML.

  • Một số loại người trợ giúp tốt, chẳng hạn như FuncAction . Những loại này là đại biểu với Hỗ trợ chung. Đã qua rồi những ngày tuyên bố các loại đại biểu tùy chỉnh (và không thể thay thế) của riêng bạn.

Tất cả những điều trên là một phần của .NET Framework và có sẵn từ bất kỳ ngôn ngữ .NET nào (VB.NET, C #, IronPython, COBOL .NET, v.v.).


Ok, về các tính năng ngôn ngữ. Tôi sẽ gắn bó với C #, vì đó là điều tôi biết rõ nhất. VB.NET cũng có một số cải tiến tương tự (và một vài điều mà C # không có được - bằng chữ XML). Đây là một danh sách ngắn và không đầy đủ.

  • Phương thức mở rộng - điều này cho phép bạn "thêm" một phương thức để nhập. Phương thức này thực sự là một phương thức tĩnh được truyền qua một thể hiện của loại và được giới hạn trong hợp đồng công khai của loại, nhưng nó rất hữu ích để thêm phương thức vào các loại bạn không kiểm soát (chuỗi) hoặc thêm (thực hiện đầy đủ ) phương thức trợ giúp cho giao diện.

  • Cú pháp hiểu toàn diện truy vấn - điều này cho phép bạn viết theo cấu trúc SQL Like. Tất cả nội dung này được dịch sang các phương thức trên System.Linq.Queryable hoặc System.Linq.Enumerable (tùy thuộc vào Loại khách hàng của tôi). Nó là hoàn toàn tùy chọn và bạn có thể sử dụng LINQ tốt mà không cần nó. Một lợi thế cho kiểu khai báo truy vấn này là các biến phạm vi được đặt trong phạm vi: chúng không cần phải khai báo lại cho mỗi mệnh đề.

    IEnumerable<string> result =
     from c in myCustomers
     where c.Name.StartsWith("B")
     select c.Name;
    
  • Biểu thức Lambda - Đây là một tốc ký để chỉ định một phương pháp. Trình biên dịch C # sẽ dịch từng thành một phương thức ẩn danh hoặc đúng System.Linq.Expressions.Expression. Bạn thực sự cần phải hiểu những điều này để sử dụng Linq tốt. Có ba phần: danh sách tham số, mũi tên và thân phương thức.

    IEnumerable<string> result = myCustomers
     .Where(c => c.Name.StartsWith("B"))
     .Select(c => c.Name);`
    
  • Các loại ẩn danh - Đôi khi trình biên dịch có đủ thông tin để tạo một loại cho bạn. Các loại này không thực sự ẩn danh: trình biên dịch đặt tên cho chúng khi nó tạo ra chúng. Nhưng những cái tên đó được tạo ra vào thời gian biên dịch, quá muộn để nhà phát triển sử dụng tên đó vào thời điểm thiết kế.

    myCustomers.Select(c => new 
    {
      Name = c.Name;
      Age = c.Age;
    })
    
  • Các kiểu ngầm định - Đôi khi trình biên dịch có đủ thông tin từ một khởi tạo mà nó có thể tìm ra loại cho bạn. Bạn có thể hướng dẫn trình biên dịch làm như vậy bằng cách sử dụng từ khóa var. Việc gõ ngầm được yêu cầu để khai báo các biến cho Loại ẩn danh, vì các lập trình viên không thể sử dụng tên của loại ẩn danh .

    // The compiler will determine that names is an IEnumerable<string>
    var names = myCustomers.Select(c => c.Name);
    

14

LINQ (Truy vấn ngôn ngữ) có thể tham khảo:

  • một thư viện để thu thập và thao tác lặp để sử dụng rộng rãi các hàm bậc cao hơn làm đối số (System.Linq)

  • một thư viện để truyền và thao tác các hàm đơn giản dưới dạng cây cú pháp trừu tượng (System.Linq.Expressions)

  • một phần mở rộng cú pháp cho các ngôn ngữ khác nhau để cung cấp cú pháp giống SQL hơn để xử lý các bộ sưu tập, ký hiệu nhỏ gọn hơn cho các hàm ẩn danh và cơ chế giới thiệu các hàm trợ giúp tĩnh không thể phân biệt về mặt cú pháp với các hàm thành viên cuối cùng

  • một định nghĩa giao diện mà các nhà cung cấp dữ liệu có thể tuân thủ để nhận cấu trúc truy vấn và có khả năng thực hiện tối ưu hóa trên đó, hoặc đôi khi chính các nhà cung cấp dữ liệu tương thích

Các thành phần có thể được sử dụng trong sự cô lập hoặc kết hợp.


10

Tóm lại, LINQ (Truy vấn tích hợp ngôn ngữ) cho phép bạn viết các truy vấn trực tiếp trong mã của mình. Các truy vấn đó có thể nằm trên cơ sở dữ liệu quan hệ, nhưng cũng trên các đối tượng chứa XML hoặc trong bộ nhớ, chẳng hạn như mảng và danh sách. Thêm thông tin có sẵn trong thư viện MSDN: http://msdn.microsoft.com/en-us/l Library / bb308959.aspx


Điều này là chính xác và súc tích.
SSD

6

Tôi sẽ cố gắng trả lời đơn giản: LINQ là cách để bạn truy vấn cơ sở dữ liệu của bạn (hoặc kho dữ liệu khác, XML, v.v.) bằng ngôn ngữ truy vấn tương tự như SQL nhưng có thể được biên dịch trong ứng dụng .NET.


1
Vậy chính xác sự khác biệt giữa Linq và SQL là gì?
Kredns

Tôi nghĩ có một cái tên phức tạp hơn nhưng các cấu trúc khác nhau: SQL là Chọn từ đâu và LINQ là từ đâu Chọn. LINQ dễ dàng hơn để lặp với. LINQ chỉ dễ dàng hơn :) và SQL mà nó tạo ra thường đủ tốt để xem xét việc tiết kiệm thời gian.
jcollum

2
thành thật mà nói, người ta có thể lập luận SQL nên được viết là From Where Select, etc.- tức là nó nên được viết theo cách mà Bộ kết quả thực sự được hình thành
Don Cheadle

6

LINQ là viết tắt của Ngôn ngữ truy vấn tích hợp và là cách cung cấp cơ chế "truy vấn" mục đích chung trong CLR.

Ở cấp độ cơ bản nhất, nó bao gồm một tập hợp các phương thức trên IEnumerable <T> - ví dụ: Chọn, Tổng, Ở đâu - có thể được sử dụng cho các hạn chế, dự đoán, v.v. [1]

Nói thêm một chút, LINQ cũng định nghĩa một mô hình nhà cung cấp LINQ mới có thể lấy một cây biểu thức và sử dụng nó để chạy các truy vấn "gốc" đối với nguồn dữ liệu bên ngoài CLR - ví dụ: LINQ to SQL, LINQ sang XML, LINQ đến NHibernate, v.v.

C # và VB.NET cũng đã xác định cú pháp truy vấn cho phép bạn viết các truy vấn được gõ mạnh nội tuyến (trông rất giống với SQL), sau đó trình biên dịch sẽ chuyển thành các lệnh gọi <T> tương đương của IE.

Đối với tôi, điều thú vị nhất về LINQ là tất cả các tính năng C # và VB.NET cần thiết để hỗ trợ nó đều hữu ích theo cách riêng của họ. Các phương thức mở rộng, loại ẩn danh, biểu thức lambda và gõ ngầm đều được yêu cầu để hỗ trợ LINQ - nhưng chúng tôi có xu hướng sử dụng các tính năng đó bên ngoài bối cảnh LINQ thuần túy.

[1] Đó là những thuật ngữ quan hệ, các lập trình viên chức năng có thể sẽ thích Map, Giảm, Gấp, v.v.


5

LINQ là một công nghệ để trích xuất dữ liệu bằng cách sử dụng một thành ngữ có nguồn gốc từ ngôn ngữ lập trình C #. Mặc dù có nhiều thiết kế chức năng đối với SQL, nhưng về cơ bản, nó là ngôn ngữ truy vấn dữ liệu của riêng nó. Nó hoạt động trên một phổ rộng các nguồn dữ liệu (cơ sở dữ liệu SQL, biểu diễn trong bộ nhớ, XML, v.v.). Đặc biệt, LINQ-To-SQL phải được xem là sự tương phản với việc sử dụng SQL nhúng truyền thống, chịu đựng cái thường được gọi là "sự không phù hợp trở kháng" giữa lập trình SQL và lập trình C # / VB.

Đối với một cuộc thảo luận về LINQ và những hạn chế của nó, bạn có thể muốn xem xét câu hỏi liên quan này: Không LINQ để SQL bỏ lỡ điểm?


0

http://msdn.microsoft.com/en-us/netframework/aa904594.aspx

"Dự án LINQ là tên mã cho một tập hợp các phần mở rộng cho .NET Framework bao gồm các hoạt động truy vấn, đặt và chuyển đổi tích hợp ngôn ngữ. Nó mở rộng C # và Visual Basic với cú pháp ngôn ngữ gốc cho các truy vấn và cung cấp các thư viện lớp để tận dụng lợi thế của các thư viện lớp. những khả năng này. "


Vì vậy, nó là cho cơ sở dữ liệu? Đối với những gì tôi đã thấy ở đây (trong SO) thì giống với các bộ sưu tập trong môi trường .net hơn.
OscarRyz
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.