LINQ - Hướng dẫn nhanh
Các nhà phát triển trên toàn thế giới luôn gặp phải vấn đề khi truy vấn dữ liệu do thiếu đường dẫn xác định và cần phải thông thạo nhiều công nghệ như SQL, Web Services, XQuery, v.v.
Được giới thiệu trong Visual Studio 2008 và được thiết kế bởi Anders Hejlsberg, LINQ (Truy vấn tích hợp ngôn ngữ) cho phép viết truy vấn ngay cả khi không có kiến thức về các ngôn ngữ truy vấn như SQL, XML, v.v. Các truy vấn LINQ có thể được viết cho các kiểu dữ liệu đa dạng.
Ví dụ về truy vấn LINQ
C #
using System;
using System.Linq;
class Program {
static void Main() {
string[] words = {"hello", "wonderful", "LINQ", "beautiful", "world"};
//Get only short words
var shortWords = from word in words where word.Length <= 5 select word;
//Print each word out
foreach (var word in shortWords) {
Console.WriteLine(word);
}
Console.ReadLine();
}
}
VB
Module Module1
Sub Main()
Dim words As String() = {"hello", "wonderful", "LINQ", "beautiful", "world"}
' Get only short words
Dim shortWords = From word In words _ Where word.Length <= 5 _ Select word
' Print each word out.
For Each word In shortWords
Console.WriteLine(word)
Next
Console.ReadLine()
End Sub
End Module
Khi đoạn mã trên của C # hoặc VB được biên dịch và thực thi, nó tạo ra kết quả sau:
hello
LINQ
world
Cú pháp của LINQ
Có hai cú pháp của LINQ. Đây là những cái sau đây.
Cú pháp Lamda (Method)
var longWords = words.Where( w ⇒ w.length > 10);
Dim longWords = words.Where(Function(w) w.length > 10)
Cú pháp truy vấn (hiểu)
var longwords = from w in words where w.length > 10;
Dim longwords = from w in words where w.length > 10
Các loại LINQ
Các loại LINQ được đề cập ngắn gọn bên dưới.
- LINQ đến Đối tượng
- LINQ sang XML (XLINQ)
- LINQ thành DataSet
- LINQ sang SQL (DLINQ)
- LINQ cho các thực thể
Ngoài loại trên, còn có một loại LINQ có tên PLINQ là LINQ song song của Microsoft.
Kiến trúc LINQ trong .NET
LINQ có kiến trúc 3 lớp, trong đó lớp trên cùng bao gồm các phần mở rộng ngôn ngữ và lớp dưới cùng bao gồm các nguồn dữ liệu thường là các đối tượng triển khai giao diện chung IEnumerable <T> hoặc IQueryable <T>. Kiến trúc được hiển thị bên dưới.
Biểu thức truy vấn
Biểu thức truy vấn không là gì ngoài một truy vấn LINQ, được thể hiện dưới dạng tương tự như SQL với các toán tử truy vấn như Select, Where và OrderBy. Biểu thức truy vấn thường bắt đầu bằng từ khóa "Từ".
Để truy cập toán tử truy vấn LINQ chuẩn, không gian tên System.Query phải được nhập theo mặc định. Các biểu thức này được viết trong cú pháp truy vấn khai báo là C # 3.0.
Dưới đây là một ví dụ để hiển thị một hoạt động truy vấn hoàn chỉnh bao gồm tạo nguồn dữ liệu, định nghĩa biểu thức truy vấn và thực thi truy vấn.
C #
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Operators {
class LINQQueryExpressions {
static void Main() {
// Specify the data source.
int[] scores = new int[] { 97, 92, 81, 60 };
// Define the query expression.
IEnumerable<int> scoreQuery = from score in scores where score > 80 select score;
// Execute the query.
foreach (int i in scoreQuery) {
Console.Write(i + " ");
}
Console.ReadLine();
}
}
}
Khi đoạn mã trên được biên dịch và thực thi, nó tạo ra kết quả sau:
97 92 81
Phương pháp mở rộng
Được giới thiệu với .NET 3.5, các phương thức Mở rộng chỉ được khai báo trong các lớp tĩnh và cho phép bao gồm các phương thức tùy chỉnh vào các đối tượng để thực hiện một số hoạt động truy vấn chính xác để mở rộng một lớp mà không phải là thành viên thực sự của lớp đó. Chúng cũng có thể bị quá tải.
Tóm lại, các phương thức mở rộng được sử dụng để dịch các biểu thức truy vấn thành các lời gọi phương thức truyền thống (hướng đối tượng).
Sự khác biệt giữa LINQ và Thủ tục được lưu trữ
Có một loạt các khác biệt tồn tại giữa các thủ tục LINQ và Đã lưu trữ. Những khác biệt này được đề cập dưới đây.
Các thủ tục được lưu trữ nhanh hơn nhiều so với truy vấn LINQ vì chúng tuân theo một kế hoạch thực thi dự kiến.
Dễ dàng tránh được lỗi thời gian chạy trong khi thực hiện truy vấn LINQ so với thủ tục được lưu trữ vì quy trình trước đây có hỗ trợ Intellisense của Visual Studio cũng như kiểm tra kiểu đầy đủ trong thời gian biên dịch.
LINQ cho phép gỡ lỗi bằng cách sử dụng trình gỡ lỗi .NET không có trong các thủ tục được lưu trữ.
LINQ cung cấp hỗ trợ cho nhiều cơ sở dữ liệu trái ngược với các thủ tục được lưu trữ, trong đó điều cần thiết là phải viết lại mã cho các loại cơ sở dữ liệu khác nhau.
Việc triển khai giải pháp dựa trên LINQ dễ dàng và đơn giản hơn so với việc triển khai một tập hợp các thủ tục được lưu trữ.
Cần cho LINQ
Trước LINQ, điều cần thiết là phải học C #, SQL và các API khác nhau liên kết cả hai lại với nhau để tạo thành một ứng dụng hoàn chỉnh. Do đó, các nguồn dữ liệu và ngôn ngữ lập trình này gặp phải trở kháng không phù hợp; nhu cầu về mã hóa ngắn được cảm nhận.
Dưới đây là một ví dụ về số lượng các kỹ thuật đa dạng đã được các nhà phát triển sử dụng khi truy vấn dữ liệu trước khi LINQ ra đời.
SqlConnection sqlConnection = new SqlConnection(connectString);
SqlConnection.Open();
System.Data.SqlClient.SqlCommand sqlCommand = new SqlCommand();
sqlCommand.Connection = sqlConnection;
sqlCommand.CommandText = "Select * from Customer";
return sqlCommand.ExecuteReader (CommandBehavior.CloseConnection)
Điều thú vị là trong số các dòng mã đặc trưng, truy vấn chỉ được xác định bởi hai dòng cuối cùng. Sử dụng LINQ, cùng một truy vấn dữ liệu có thể được viết ở dạng mã màu có thể đọc được như biểu mẫu được đề cập bên dưới trong thời gian ngắn hơn.
Northwind db = new Northwind(@"C:\Data\Northwnd.mdf");
var query = from c in db.Customers select c;
Ưu điểm của LINQ
LINQ cung cấp một loạt các lợi thế và trong số đó, quan trọng nhất là tính biểu cảm mạnh mẽ cho phép các nhà phát triển thể hiện một cách khai báo. Dưới đây là một số ưu điểm khác của LINQ.
LINQ cung cấp đánh dấu cú pháp chứng tỏ hữu ích để tìm ra lỗi trong thời gian thiết kế.
LINQ cung cấp IntelliSense có nghĩa là dễ dàng viết các truy vấn chính xác hơn.
Viết mã khá nhanh hơn trong LINQ và do đó thời gian phát triển cũng giảm đáng kể.
LINQ giúp gỡ lỗi dễ dàng do tích hợp trong ngôn ngữ C #.
Việc xem mối quan hệ giữa hai bảng dễ dàng với LINQ do tính năng phân cấp của nó và điều này cho phép soạn các truy vấn kết hợp nhiều bảng trong thời gian ngắn hơn.
LINQ cho phép sử dụng một cú pháp LINQ duy nhất trong khi truy vấn nhiều nguồn dữ liệu đa dạng và điều này chủ yếu là do nền tảng thống nhất của nó.
LINQ có thể mở rộng có nghĩa là có thể sử dụng kiến thức về LINQ để truy vấn các kiểu nguồn dữ liệu mới.
LINQ cung cấp cơ sở kết hợp nhiều nguồn dữ liệu trong một truy vấn duy nhất cũng như chia các vấn đề phức tạp thành một tập hợp các truy vấn ngắn dễ gỡ lỗi.
LINQ cung cấp khả năng chuyển đổi dễ dàng để chuyển đổi kiểu dữ liệu này sang kiểu dữ liệu khác như chuyển đổi dữ liệu SQL sang dữ liệu XML.
Trước khi bắt đầu với các chương trình LINQ, tốt nhất là trước tiên bạn nên hiểu các sắc thái của việc thiết lập môi trường LINQ. LINQ cần một khung công tác .NET, một nền tảng mang tính cách mạng để có nhiều loại ứng dụng đa dạng. Một truy vấn LINQ có thể được viết bằng C # hoặc Visual Basic một cách thuận tiện.
Microsoft cung cấp các công cụ cho cả hai ngôn ngữ này, tức là C # và Visual Basic bằng Visual Studio. Các ví dụ của chúng tôi đều được biên dịch và viết bằng Visual Studio 2010. Tuy nhiên, phiên bản Visual Basic 2013 cũng có sẵn để sử dụng. Đây là phiên bản mới nhất và có nhiều điểm tương đồng với Visual Studio 2012.
Cài đặt Visual Studio 2010 trên Windows 7
Visual Studio có thể được cài đặt từ một phương tiện cài đặt như DVD. Cần có thông tin đăng nhập quản trị viên để cài đặt thành công Visual Basic 2010 trên hệ thống của bạn. Điều quan trọng là phải ngắt kết nối tất cả USB có thể tháo rời khỏi hệ thống trước khi cài đặt nếu không quá trình cài đặt có thể không thành công. Một số yêu cầu phần cứng cần thiết để cài đặt là những yêu cầu sau.
yêu cầu phần cứng
- 1,6 GHz trở lên
- RAM 1 GB
- 3 GB (Dung lượng đĩa cứng khả dụng)
- Ổ đĩa cứng 5400 RPM
- Card màn hình tương thích DirectX 9
- Ổ DVD-ROM
Các bước cài đặt
Step 1 - Đầu tiên sau khi chèn DVD với Gói Visual Studio 2010, hãy nhấp vào Install or run program from your media xuất hiện trong một hộp bật lên trên màn hình.
Step 2- Bây giờ thiết lập cho Visual Studio sẽ xuất hiện trên màn hình. ChọnInstall Microsoft Visual Studio 2010.
Step 3- Ngay sau khi bạn nhấp vào, quá trình sẽ bắt đầu và một cửa sổ thiết lập sẽ xuất hiện trên màn hình của bạn. Sau khi hoàn thành tải các thành phần cài đặt sẽ mất một khoảng thời gian, hãy nhấp vàoNext để chuyển sang bước tiếp theo.
Step 4 - Đây là bước cuối cùng của cài đặt và một trang bắt đầu sẽ xuất hiện trong đó bạn chỉ cần chọn "Tôi đã đọc và chấp nhận các điều khoản cấp phép" và nhấp vào Next cái nút.
Step 5- Bây giờ chọn các tính năng để cài đặt từ trang tùy chọn xuất hiện trên màn hình của bạn. Bạn có thể chọnFull hoặc là CustomLựa chọn. Nếu bạn có ít dung lượng ổ đĩa hơn yêu cầu được hiển thị trong yêu cầu về dung lượng đĩa, hãy chuyển sang Tùy chỉnh.
Step 6- Khi bạn chọn tùy chọn Custom, cửa sổ sau sẽ xuất hiện. Chọn các tính năng bạn muốn cài đặt và nhấp vàoUpdate hoặc nếu không, hãy chuyển sang bước 7. Tuy nhiên, bạn không nên đi với tùy chọn tùy chỉnh vì trong tương lai, bạn có thể cần các tính năng bạn đã chọn để không có.
Step 7- Ngay sau đó một cửa sổ bật lên sẽ được hiển thị và quá trình cài đặt sẽ bắt đầu, có thể mất nhiều thời gian. Hãy nhớ rằng, đây là để cài đặt tất cả các thành phần.
Step 8- Cuối cùng, bạn sẽ có thể xem thông báo trong cửa sổ rằng quá trình cài đặt đã hoàn tất thành công. Nhấp chuộtFinish.
Viết chương trình C # bằng LINQ trong Visual Studio 2010
Khởi động phiên bản Visual Studio 2010 Ultimate và chọn Tệp, sau đó là Dự án mới từ menu.
Một hộp thoại dự án mới sẽ xuất hiện trên màn hình của bạn.
Bây giờ chọn Visual C # làm danh mục trong các mẫu đã cài đặt và tiếp theo chọn mẫu Ứng dụng Bảng điều khiển như thể hiện trong hình bên dưới.
Đặt tên cho dự án của bạn trong hộp tên dưới cùng và nhấn OK.
Dự án mới sẽ xuất hiện trong Trình khám phá giải pháp ở phía bên phải của hộp thoại mới trên màn hình của bạn.
Bây giờ chọn Program.cs từ Trình khám phá giải pháp và bạn có thể xem mã trong cửa sổ trình chỉnh sửa bắt đầu bằng 'using System'.
Tại đây bạn có thể bắt đầu viết mã chương trình C # sau đây của mình.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace HelloWorld {
class Program {
static void Main(string[] args) {
Console.WriteLine("Hello World")
Console.ReadKey();
}
}
}
Nhấn phím F5 và chạy dự án của bạn. Bạn nên lưu dự án bằng cách chọnFile → Save All trước khi chạy dự án.
Viết chương trình VB bằng LINQ trong Visual Studio 2010
Khởi động phiên bản Visual Studio 2010 Ultimate và chọn Tệp, sau đó là Dự án mới từ menu.
Một hộp thoại dự án mới sẽ xuất hiện trên màn hình của bạn.
Bây giờ chọn Visual Basic làm danh mục trong các mẫu đã cài đặt và tiếp theo chọn mẫu Ứng dụng Bảng điều khiển.
Đặt tên cho dự án của bạn trong hộp tên dưới cùng và nhấn OK.
Bạn sẽ nhận được một màn hình với Module1.vb. Bắt đầu viết mã VB của bạn tại đây bằng LINQ.
Module Module1
Sub Main()
Console.WriteLine("Hello World")
Console.ReadLine()
End Sub
End Module
Nhấn phím F5 và chạy dự án của bạn. Bạn nên lưu dự án bằng cách chọnFile → Save All trước khi chạy dự án.
Khi đoạn mã trên của C # hoặc VB được tạo và chạy, nó tạo ra kết quả sau:
Hello World
Một tập hợp các phương thức mở rộng tạo thành một mẫu truy vấn được gọi là Toán tử Truy vấn Chuẩn LINQ. Là khối xây dựng các biểu thức truy vấn LINQ, các toán tử này cung cấp một loạt các khả năng truy vấn như lọc, sắp xếp, chiếu, tổng hợp, v.v.
Các toán tử truy vấn chuẩn LINQ có thể được phân loại thành các toán tử sau trên cơ sở chức năng của chúng.
- Toán tử lọc
- Tham gia nhà điều hành
- Phép toán chiếu
- Nhà điều hành sắp xếp
- Nhóm các nhà khai thác
- Conversions
- Concatenation
- Aggregation
- Hoạt động định lượng
- Hoạt động phân vùng
- Hoạt động tạo
- Đặt hoạt động
- Equality
- Toán tử phần tử
Toán tử lọc
Lọc là một hoạt động để hạn chế tập kết quả sao cho nó chỉ có các phần tử được chọn thỏa mãn một điều kiện cụ thể.
Hiển thị các ví dụ
Nhà điều hành | Sự miêu tả | Cú pháp biểu thức truy vấn C # | Cú pháp biểu thức truy vấn VB |
---|---|---|---|
Ở đâu | Lọc các giá trị dựa trên một hàm vị từ | Ở đâu | Ở đâu |
OfType | Lọc các giá trị dựa trên khả năng trở thành một loại được chỉ định | Không áp dụng | Không áp dụng |
Tham gia nhà điều hành
Tham gia đề cập đến một hoạt động trong đó các nguồn dữ liệu có mối quan hệ khó theo dõi với nhau theo cách trực tiếp được nhắm mục tiêu.
Hiển thị các ví dụ
Nhà điều hành | Sự miêu tả | Cú pháp biểu thức truy vấn C # | Cú pháp biểu thức truy vấn VB |
---|---|---|---|
Tham gia | Nhà điều hành nối hai chuỗi trên cơ sở các khóa phù hợp | tham gia… trong… trên… bằng… | Từ x In…, y In… Where xa = ya |
GroupJoin | Nối hai chuỗi và nhóm các phần tử phù hợp | tham gia… vào… trên… bằng… vào… | Tham gia nhóm… Trong… Trên… |
Phép toán chiếu
Phép chiếu là một phép toán trong đó một đối tượng được chuyển thành một dạng hoàn toàn mới với chỉ các thuộc tính cụ thể.
Hiển thị các ví dụ
Nhà điều hành | Sự miêu tả | Cú pháp biểu thức truy vấn C # | Cú pháp biểu thức truy vấn VB |
---|---|---|---|
Lựa chọn | Nhà điều hành chiếu các giá trị dựa trên một hàm biến đổi | lựa chọn | Lựa chọn |
SelectMany | Nhà điều hành chiếu các chuỗi giá trị dựa trên một hàm biến đổi cũng như làm phẳng chúng thành một chuỗi duy nhất | Sử dụng nhiều từ mệnh đề | Sử dụng nhiều mệnh đề Từ |
Nhà điều hành sắp xếp
Thao tác sắp xếp cho phép sắp xếp thứ tự các phần tử của một chuỗi trên cơ sở một hoặc nhiều thuộc tính.
Hiển thị các ví dụ
Nhà điều hành | Sự miêu tả | Cú pháp biểu thức truy vấn C # | Cú pháp biểu thức truy vấn VB |
---|---|---|---|
Đặt bởi | Toán tử sắp xếp các giá trị theo thứ tự tăng dần | đặt bởi | Đặt bởi |
OrderByDescending | Toán tử sắp xếp các giá trị theo thứ tự giảm dần | trật tự ... giảm dần | Đặt hàng theo ... Giảm dần |
ThenBy | Thực hiện sắp xếp thứ cấp theo thứ tự tăng dần | đặt bởi …, … | Đặt bởi …, … |
ThenByDescending | Thực hiện sắp xếp thứ cấp theo thứ tự giảm dần | theo thứ tự…,… giảm dần | Đặt hàng theo…,… Giảm dần |
Đảo ngược | Thực hiện đảo ngược thứ tự của các phần tử trong một tập hợp | Không áp dụng | Không áp dụng |
Nhóm các nhà khai thác
Các nhà khai thác đưa dữ liệu vào một số nhóm dựa trên một thuộc tính được chia sẻ chung.
Hiển thị các ví dụ
Nhà điều hành | Sự miêu tả | Cú pháp biểu thức truy vấn C # | Cú pháp biểu thức truy vấn VB |
---|---|---|---|
GroupBy | Sắp xếp một chuỗi các mục theo nhóm và trả lại chúng dưới dạng tập hợp IEnumerable của loại IGrouping <key, element> | nhóm… bởi -hoặc- nhóm… bởi… thành… | Nhóm… Bởi… Vào… |
Tra cứu | Thực hiện một hoạt động nhóm trong đó một chuỗi các cặp khóa được trả về | Không áp dụng | Không áp dụng |
Chuyển đổi
Các toán tử thay đổi loại đối tượng đầu vào và được sử dụng trong một loạt các ứng dụng.
Hiển thị các ví dụ
Nhà điều hành | Sự miêu tả | Cú pháp biểu thức truy vấn C # | Cú pháp biểu thức truy vấn VB |
---|---|---|---|
AsEnumerable | Trả về đầu vào được nhập là IEnumerable <T> | Không áp dụng | Không áp dụng |
AsQueryable | A (chung) IEnumerable được chuyển đổi thành IQueryable (chung) | Không áp dụng | Không áp dụng |
Diễn viên | Thực hiện truyền các phần tử của một bộ sưu tập sang một kiểu cụ thể | Sử dụng một biến phạm vi được nhập rõ ràng. Vd: từ chuỗi str trong các từ | Từ… Như… |
OfType | Các giá trị của bộ lọc dựa trên cơ sở của chúng, tùy thuộc vào khả năng của chúng để được truyền đến một loại cụ thể | Không áp dụng | Không áp dụng |
ToArray | Buộc thực thi truy vấn và thực hiện chuyển đổi một tập hợp thành một mảng | Không áp dụng | Không áp dụng |
ToDictionary | Trên cơ sở của chức năng bộ chọn khóa, đặt các phần tử thành Từ điển <TKey, TValue> và buộc thực hiện truy vấn LINQ | Không áp dụng | Không áp dụng |
Liệt kê | Buộc thực hiện một truy vấn bằng cách chuyển đổi một tập hợp thành một Danh sách <T> | Không áp dụng | Không áp dụng |
Tra cứu | Buộc thực hiện một truy vấn và đưa các phần tử vào một Tìm kiếm <TKey, TElement> trên cơ sở một chức năng bộ chọn khóa | Không áp dụng | Không áp dụng |
Kết nối
Thực hiện nối hai chuỗi và khá giống với toán tử Union về hoạt động của nó ngoại trừ thực tế là điều này không loại bỏ các bản sao.
Hiển thị các ví dụ
Nhà điều hành | Sự miêu tả | Cú pháp biểu thức truy vấn C # | Cú pháp biểu thức truy vấn VB |
---|---|---|---|
Concat | Hai trình tự được nối với nhau để tạo thành một trình tự duy nhất. | Không áp dụng | Không áp dụng |
Tổng hợp
Thực hiện bất kỳ loại tổng hợp mong muốn nào và cho phép tạo các tập hợp tùy chỉnh trong LINQ.
Hiển thị các ví dụ
Nhà điều hành | Sự miêu tả | Cú pháp biểu thức truy vấn C # | Cú pháp biểu thức truy vấn VB |
---|---|---|---|
Tổng hợp | Hoạt động trên các giá trị của một tập hợp để thực hiện thao tác tổng hợp tùy chỉnh | Không áp dụng | Không áp dụng |
Trung bình cộng | Giá trị trung bình của một tập hợp các giá trị được tính | Không áp dụng | Tổng hợp… Trong… Thành Trung bình () |
Đếm | Đếm các phần tử thỏa mãn một hàm vị từ trong bộ sưu tập | Không áp dụng | Tổng hợp… Trong… Into Count () |
LonCount | Đếm các phần tử đáp ứng một chức năng vị từ trong một tập hợp lớn | Không áp dụng | Tổng hợp… Trong… Into LongCount () |
Max | Tìm ra giá trị lớn nhất trong một bộ sưu tập | Không áp dụng | Tổng hợp… Trong… Vào Max () |
Min | Tìm ra giá trị tối thiểu hiện có trong bộ sưu tập | Không áp dụng | Tổng hợp… Trong… Vào Min () |
Tổng | Tìm ra tổng giá trị trong một tập hợp | Không áp dụng | Tổng hợp… Trong… Thành Tổng () |
Hoạt động định lượng
Các toán tử này trả về giá trị Boolean tức là Đúng hoặc Sai khi một số hoặc tất cả các phần tử trong một dãy thỏa mãn một điều kiện cụ thể.
Hiển thị các ví dụ
Nhà điều hành | Sự miêu tả | Cú pháp biểu thức truy vấn C # | Cú pháp biểu thức truy vấn VB |
---|---|---|---|
Tất cả | Trả về giá trị 'True' nếu tất cả các phần tử của một chuỗi thỏa mãn điều kiện vị từ | Không áp dụng | Tổng hợp… Trong… Thành tất cả (…) |
Bất kì | Xác định bằng cách tìm kiếm một chuỗi xem liệu bất kỳ phần tử nào của cùng một thỏa mãn một điều kiện cụ thể | Không áp dụng | Tổng hợp… Trong… Thành bất kỳ () |
Chứa đựng | Trả về giá trị 'True' nếu phát hiện thấy một phần tử cụ thể có trong một chuỗi nếu chuỗi không chứa phần tử cụ thể đó, giá trị 'false' được trả về | Không áp dụng | Không áp dụng |
Nhà điều hành phân vùng
Chia một chuỗi đầu vào thành hai phần riêng biệt mà không cần sắp xếp lại các phần tử của chuỗi và sau đó trả về một trong số chúng.
Hiển thị các ví dụ
Nhà điều hành | Sự miêu tả | Cú pháp biểu thức truy vấn C # | Cú pháp biểu thức truy vấn VB |
---|---|---|---|
Nhảy | Bỏ qua một số phần tử được chỉ định trong một chuỗi và trả về những phần tử còn lại | Không áp dụng | Nhảy |
SkipWhile | Tương tự như Skip với ngoại lệ duy nhất là số phần tử cần bỏ qua được chỉ định bởi điều kiện Boolean | Không áp dụng | Bỏ qua trong khi |
Lấy | Lấy một số phần tử cụ thể từ một chuỗi và bỏ qua những phần tử còn lại | Không áp dụng | Lấy |
TakeWhile | Tương tự như Take ngoại trừ thực tế là số phần tử cần lấy được chỉ định bởi điều kiện Boolean | Không áp dụng | Đi trong khi |
Hoạt động tạo
Một chuỗi giá trị mới được tạo bởi các toán tử thế hệ.
Hiển thị các ví dụ
Nhà điều hành | Sự miêu tả | Cú pháp biểu thức truy vấn C # | Cú pháp biểu thức truy vấn VB |
---|---|---|---|
DefaultIfEmpty | Khi áp dụng cho một chuỗi trống, hãy tạo một phần tử mặc định trong một chuỗi | Không áp dụng | Không áp dụng |
Trống | Trả về một chuỗi giá trị trống và là toán tử thế hệ đơn giản nhất | Không áp dụng | Không áp dụng |
Phạm vi | Tạo một tập hợp có một chuỗi số nguyên hoặc số | Không áp dụng | Không áp dụng |
Nói lại | Tạo một chuỗi chứa các giá trị lặp lại có độ dài cụ thể | Không áp dụng | Không áp dụng |
Đặt hoạt động
Có bốn toán tử cho các hoạt động đã đặt, mỗi toán tử cho kết quả dựa trên các tiêu chí khác nhau.
Hiển thị các ví dụ
Nhà điều hành | Sự miêu tả | Cú pháp biểu thức truy vấn C # | Cú pháp biểu thức truy vấn VB |
---|---|---|---|
Khác biệt | Kết quả một danh sách các giá trị duy nhất từ một bộ sưu tập bằng cách lọc dữ liệu trùng lặp nếu có | Không áp dụng | Khác biệt |
Ngoại trừ | So sánh các giá trị của hai bộ sưu tập và trả về các giá trị từ một bộ sưu tập không có trong bộ sưu tập kia | Không áp dụng | Không áp dụng |
Giao nhau | Trả về tập giá trị được tìm thấy t giống nhau trong hai tập hợp riêng biệt | Không áp dụng | Không áp dụng |
liên hiệp | Kết hợp nội dung của hai bộ sưu tập khác nhau thành một danh sách duy nhất mà không có bất kỳ nội dung trùng lặp nào | Không áp dụng | Không áp dụng |
Bình đẳng
So sánh hai câu (có thể liệt kê) và xác định xem chúng có khớp chính xác hay không.
Hiển thị các ví dụ
Nhà điều hành | Sự miêu tả | Cú pháp biểu thức truy vấn C # | Cú pháp biểu thức truy vấn VB |
---|---|---|---|
SequenceEqual | Kết quả là một giá trị Boolean nếu hai chuỗi được tìm thấy giống hệt nhau | Không áp dụng | Không áp dụng |
Toán tử phần tử
Ngoại trừ DefaultIfEmpty, tất cả tám toán tử phần tử truy vấn tiêu chuẩn còn lại trả về một phần tử duy nhất từ một tập hợp.
Hiển thị các ví dụ
Nhà điều hành | Sự miêu tả | Cú pháp biểu thức truy vấn C # | Cú pháp biểu thức truy vấn VB |
---|---|---|---|
ElementAt | Trả về một phần tử có trong một chỉ mục cụ thể trong một tập hợp | Không áp dụng | Không áp dụng |
ElementAtOrDefault | Tương tự như ElementAt ngoại trừ thực tế là nó cũng trả về giá trị mặc định trong trường hợp chỉ mục cụ thể nằm ngoài phạm vi | Không áp dụng | Không áp dụng |
Đầu tiên | Truy xuất phần tử đầu tiên trong một tập hợp hoặc phần tử đầu tiên thỏa mãn một điều kiện cụ thể | Không áp dụng | Không áp dụng |
FirstOrDefault | Tương tự như First ngoại trừ thực tế là nó cũng trả về giá trị mặc định trong trường hợp không có sự tồn tại của các phần tử như vậy | Không áp dụng | Không áp dụng |
Cuối cùng | Truy xuất phần tử cuối cùng có trong một tập hợp hoặc phần tử cuối cùng thỏa mãn một điều kiện cụ thể | Không áp dụng | Không áp dụng |
LastOrDefault | Tương tự như Last ngoại trừ thực tế là nó cũng trả về giá trị mặc định trong trường hợp không có bất kỳ phần tử nào như vậy | Không áp dụng | Không áp dụng |
Độc thân | Trả về phần tử duy nhất của một tập hợp hoặc phần tử duy nhất thỏa mãn một điều kiện nhất định | Không áp dụng | Không áp dụng |
SingleOrDefault | Tương tự như Single ngoại trừ nó cũng trả về giá trị mặc định nếu không có bất kỳ phần tử đơn lẻ nào như vậy | Không áp dụng | Không áp dụng |
DefaultIfEmpty | Trả về giá trị mặc định nếu bộ sưu tập hoặc danh sách trống hoặc rỗng | Không áp dụng | Không áp dụng |
LINQ to SQL cung cấp một cơ sở hạ tầng (thời gian chạy) để quản lý dữ liệu quan hệ dưới dạng các đối tượng. Nó là một thành phần của phiên bản 3.5 của .NET Framework và thực hiện việc dịch các truy vấn tích hợp ngôn ngữ của mô hình đối tượng sang SQL. Các truy vấn này sau đó được gửi đến cơ sở dữ liệu với mục đích thực thi. Sau khi nhận được kết quả từ cơ sở dữ liệu, LINQ to SQL lại dịch chúng thành các đối tượng.
Giới thiệu LINQ To SQL
Đối với hầu hết các nhà phát triển ASP.NET, LINQ to SQL (còn được gọi là DLINQ) là một phần điện tử của Truy vấn Tích hợp Ngôn ngữ vì điều này cho phép truy vấn dữ liệu trong cơ sở dữ liệu máy chủ SQL bằng cách sử dụng các biểu thức LINQ thông thường. Nó cũng cho phép cập nhật, xóa và chèn dữ liệu, nhưng nhược điểm duy nhất mà nó mắc phải là hạn chế đối với cơ sở dữ liệu máy chủ SQL. Tuy nhiên, có nhiều lợi ích của LINQ to SQL so với ADO.NET như giảm độ phức tạp, ít dòng mã hóa và nhiều lợi ích khác.
Dưới đây là sơ đồ cho thấy kiến trúc thực thi của LINQ to SQL.
Làm thế nào để sử dụng LINQ to SQL?
Step 1- Tạo một “Kết nối dữ liệu” mới với máy chủ cơ sở dữ liệu. Xem & sắp xếp; Trình khám phá máy chủ & Array; Kết nối dữ liệu & sắp xếp; Thêm kết nối
Step 2 - Thêm LINQ vào tệp lớp SQL
Step 3 - Chọn bảng từ cơ sở dữ liệu và kéo và thả vào tệp lớp LINQ to SQL mới.
Step 4 - Đã thêm bảng vào tệp lớp.
Truy vấn với LINQ to SQL
Các quy tắc để thực hiện truy vấn với LINQ to SQL tương tự như quy tắc của truy vấn LINQ tiêu chuẩn, tức là truy vấn được thực hiện hoãn lại hoặc ngay lập tức. Có nhiều thành phần khác nhau đóng vai trò trong việc thực thi một truy vấn với LINQ to SQL và đây là những thành phần sau.
LINQ to SQL API - yêu cầu thực hiện truy vấn thay mặt cho một ứng dụng và gửi nó đến LINQ tới Nhà cung cấp SQL.
LINQ to SQL Provider - chuyển đổi truy vấn sang Transact SQL (T-SQL) và gửi truy vấn mới đến Nhà cung cấp ADO để thực thi.
ADO Provider - Sau khi thực hiện truy vấn, hãy gửi kết quả dưới dạng DataReader đến LINQ tới SQL Provider để chuyển đổi nó thành dạng đối tượng người dùng.
Cần lưu ý rằng trước khi thực hiện truy vấn LINQ to SQL, điều quan trọng là phải kết nối với nguồn dữ liệu thông qua lớp DataContext.
Chèn, Cập nhật và Xóa bằng LINQ To SQL
Thêm HOẶC Chèn
C#
using System;
using System.Linq;
namespace LINQtoSQL {
class LinqToSQLCRUD {
static void Main(string[] args) {
string connectString = System.Configuration.ConfigurationManager.ConnectionStrings["LinqToSQLDBConnectionString"].ToString();
LinqToSQLDataContext db = new LinqToSQLDataContext(connectString);
//Create new Employee
Employee newEmployee = new Employee();
newEmployee.Name = "Michael";
newEmployee.Email = "[email protected]";
newEmployee.ContactNo = "343434343";
newEmployee.DepartmentId = 3;
newEmployee.Address = "Michael - USA";
//Add new Employee to database
db.Employees.InsertOnSubmit(newEmployee);
//Save changes to Database.
db.SubmitChanges();
//Get new Inserted Employee
Employee insertedEmployee = db.Employees.FirstOrDefault(e ⇒e.Name.Equals("Michael"));
Console.WriteLine("Employee Id = {0} , Name = {1}, Email = {2}, ContactNo = {3}, Address = {4}",
insertedEmployee.EmployeeId, insertedEmployee.Name, insertedEmployee.Email,
insertedEmployee.ContactNo, insertedEmployee.Address);
Console.WriteLine("\nPress any key to continue.");
Console.ReadKey();
}
}
}
VB
Module Module1
Sub Main()
Dim connectString As String = System.Configuration.ConfigurationManager.ConnectionStrings("LinqToSQLDBConnectionString").ToString()
Dim db As New LinqToSQLDataContext(connectString)
Dim newEmployee As New Employee()
newEmployee.Name = "Michael"
newEmployee.Email = "[email protected]"
newEmployee.ContactNo = "343434343"
newEmployee.DepartmentId = 3
newEmployee.Address = "Michael - USA"
db.Employees.InsertOnSubmit(newEmployee)
db.SubmitChanges()
Dim insertedEmployee As Employee = db.Employees.FirstOrDefault(Function(e) e.Name.Equals("Michael"))
Console.WriteLine("Employee Id = {0} , Name = {1}, Email = {2}, ContactNo = {3},
Address = {4}", insertedEmployee.EmployeeId, insertedEmployee.Name,
insertedEmployee.Email, insertedEmployee.ContactNo, insertedEmployee.Address)
Console.WriteLine(vbLf & "Press any key to continue.")
Console.ReadKey()
End Sub
End Module
Khi đoạn mã trên của C # hoặc VB được biên dịch và chạy, nó tạo ra kết quả sau:
Emplyee ID = 4, Name = Michael, Email = [email protected], ContactNo =
343434343, Address = Michael - USA
Press any key to continue.
Cập nhật
C#
using System;
using System.Linq;
namespace LINQtoSQL {
class LinqToSQLCRUD {
static void Main(string[] args) {
string connectString = System.Configuration.ConfigurationManager.ConnectionStrings["LinqToSQLDBConnectionString"].ToString();
LinqToSQLDataContext db = new LinqToSQLDataContext(connectString);
//Get Employee for update
Employee employee = db.Employees.FirstOrDefault(e =>e.Name.Equals("Michael"));
employee.Name = "George Michael";
employee.Email = "[email protected]";
employee.ContactNo = "99999999";
employee.DepartmentId = 2;
employee.Address = "Michael George - UK";
//Save changes to Database.
db.SubmitChanges();
//Get Updated Employee
Employee updatedEmployee = db.Employees.FirstOrDefault(e ⇒e.Name.Equals("George Michael"));
Console.WriteLine("Employee Id = {0} , Name = {1}, Email = {2}, ContactNo = {3}, Address = {4}",
updatedEmployee.EmployeeId, updatedEmployee.Name, updatedEmployee.Email,
updatedEmployee.ContactNo, updatedEmployee.Address);
Console.WriteLine("\nPress any key to continue.");
Console.ReadKey();
}
}
}
VB
Module Module1
Sub Main()
Dim connectString As String = System.Configuration.ConfigurationManager.ConnectionStrings("LinqToSQLDBConnectionString").ToString()
Dim db As New LinqToSQLDataContext(connectString)
Dim employee As Employee = db.Employees.FirstOrDefault(Function(e) e.Name.Equals("Michael"))
employee.Name = "George Michael"
employee.Email = "[email protected]"
employee.ContactNo = "99999999"
employee.DepartmentId = 2
employee.Address = "Michael George - UK"
db.SubmitChanges()
Dim updatedEmployee As Employee = db.Employees.FirstOrDefault(Function(e) e.Name.Equals("George Michael"))
Console.WriteLine("Employee Id = {0} , Name = {1}, Email = {2}, ContactNo = {3},
Address = {4}", updatedEmployee.EmployeeId, updatedEmployee.Name,
updatedEmployee.Email, updatedEmployee.ContactNo, updatedEmployee.Address)
Console.WriteLine(vbLf & "Press any key to continue.")
Console.ReadKey()
End Sub
End Module
Khi đoạn mã trên của C # hoặc Vb được biên dịch và chạy, nó tạo ra kết quả sau:
Emplyee ID = 4, Name = George Michael, Email = [email protected], ContactNo =
999999999, Address = Michael George - UK
Press any key to continue.
Xóa bỏ
C#
using System;
using System.Linq;
namespace LINQtoSQL {
class LinqToSQLCRUD {
static void Main(string[] args) {
string connectString = System.Configuration.ConfigurationManager.ConnectionStrings["LinqToSQLDBConnectionString"].ToString();
LinqToSQLDataContext db = newLinqToSQLDataContext(connectString);
//Get Employee to Delete
Employee deleteEmployee = db.Employees.FirstOrDefault(e ⇒e.Name.Equals("George Michael"));
//Delete Employee
db.Employees.DeleteOnSubmit(deleteEmployee);
//Save changes to Database.
db.SubmitChanges();
//Get All Employee from Database
var employeeList = db.Employees;
foreach (Employee employee in employeeList) {
Console.WriteLine("Employee Id = {0} , Name = {1}, Email = {2}, ContactNo = {3}",
employee.EmployeeId, employee.Name, employee.Email, employee.ContactNo);
}
Console.WriteLine("\nPress any key to continue.");
Console.ReadKey();
}
}
}
VB
Module Module1
Sub Main()
Dim connectString As String = System.Configuration.ConfigurationManager.ConnectionStrings("LinqToSQLDBConnectionString").ToString()
Dim db As New LinqToSQLDataContext(connectString)
Dim deleteEmployee As Employee = db.Employees.FirstOrDefault(Function(e) e.Name.Equals("George Michael"))
db.Employees.DeleteOnSubmit(deleteEmployee)
db.SubmitChanges()
Dim employeeList = db.Employees
For Each employee As Employee In employeeList
Console.WriteLine("Employee Id = {0} , Name = {1}, Email = {2}, ContactNo = {3}",
employee.EmployeeId, employee.Name, employee.Email, employee.ContactNo)
Next
Console.WriteLine(vbLf & "Press any key to continue.")
Console.ReadKey()
End Sub
End Module
Khi đoạn mã trên của C # hoặc VB được biên dịch và chạy, nó tạo ra kết quả sau:
Emplyee ID = 1, Name = William, Email = [email protected], ContactNo = 999999999
Emplyee ID = 2, Name = Miley, Email = [email protected], ContactNo = 999999999
Emplyee ID = 3, Name = Benjamin, Email = [email protected], ContactNo =
Press any key to continue.
LINQ to Objects cung cấp việc sử dụng bất kỳ truy vấn LINQ nào hỗ trợ IEnumerable <T> để truy cập các bộ sưu tập dữ liệu trong bộ nhớ mà không cần đến nhà cung cấp LINQ (API) như trong trường hợp LINQ to SQL hoặc LINQ to XML.
Giới thiệu LINQ cho các đối tượng
Các truy vấn trong LINQ to Objects trả về các biến kiểu thường chỉ IEnumerable <T>. Nói tóm lại, LINQ to Objects cung cấp một cách tiếp cận mới cho các bộ sưu tập như trước đó, điều quan trọng là phải viết mã hóa dài (trừ các vòng lặp phức tạp hơn nhiều) để truy xuất dữ liệu từ một bộ sưu tập hiện được thay thế bằng cách viết mã khai báo mô tả rõ ràng dữ liệu mong muốn đó là bắt buộc để truy xuất.
Ngoài ra còn có nhiều ưu điểm của LINQ to Object so với các vòng lặp foreach truyền thống như dễ đọc hơn, lọc mạnh mẽ, khả năng phân nhóm, sắp xếp thứ tự nâng cao với mã hóa ứng dụng tối thiểu. Các truy vấn LINQ như vậy cũng có bản chất nhỏ gọn hơn và có thể di động đến bất kỳ nguồn dữ liệu nào khác mà không cần bất kỳ sửa đổi nào hoặc chỉ với một chút sửa đổi.
Dưới đây là một ví dụ đơn giản về LINQ to Objects -
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace LINQtoObjects {
class Program {
static void Main(string[] args) {
string[] tools = { "Tablesaw", "Bandsaw", "Planer", "Jointer", "Drill", "Sander" };
var list = from t in tools select t;
StringBuilder sb = new StringBuilder();
foreach (string s in list) {
sb.Append(s + Environment.NewLine);
}
Console.WriteLine(sb.ToString(), "Tools");
Console.ReadLine();
}
}
}
Trong ví dụ này, một mảng chuỗi (công cụ) được sử dụng làm tập hợp các đối tượng được truy vấn bằng cách sử dụng LINQ to Objects.
Objects query is:
var list = from t in tools select t;
Khi đoạn mã trên được biên dịch và thực thi, nó tạo ra kết quả sau:
Tablesaw
Bandsaw
Planer
Jointer
Drill
Sander
Truy vấn trong Bộ sưu tập bộ nhớ bằng LINQ tới các đối tượng
C #
using System;
using System.Collections.Generic;
using System.Linq;
namespace LINQtoObjects {
class Department {
public int DepartmentId { get; set; }
public string Name { get; set; }
}
class LinqToObjects {
static void Main(string[] args) {
List<Department> departments = new List<Department>();
departments.Add(new Department { DepartmentId = 1, Name = "Account" });
departments.Add(new Department { DepartmentId = 2, Name = "Sales" });
departments.Add(new Department { DepartmentId = 3, Name = "Marketing" });
var departmentList = from d in departments
select d;
foreach (var dept in departmentList) {
Console.WriteLine("Department Id = {0} , Department Name = {1}",
dept.DepartmentId, dept.Name);
}
Console.WriteLine("\nPress any key to continue.");
Console.ReadKey();
}
}
}
VB
Imports System.Collections.Generic
Imports System.Linq
Module Module1
Sub Main(ByVal args As String())
Dim account As New Department With {.Name = "Account", .DepartmentId = 1}
Dim sales As New Department With {.Name = "Sales", .DepartmentId = 2}
Dim marketing As New Department With {.Name = "Marketing", .DepartmentId = 3}
Dim departments As New System.Collections.Generic.List(Of Department)(New Department() {account, sales, marketing})
Dim departmentList = From d In departments
For Each dept In departmentList
Console.WriteLine("Department Id = {0} , Department Name = {1}", dept.DepartmentId, dept.Name)
Next
Console.WriteLine(vbLf & "Press any key to continue.")
Console.ReadKey()
End Sub
Class Department
Public Property Name As String
Public Property DepartmentId As Integer
End Class
End Module
Khi đoạn mã trên của C # hoặc VB được biên dịch và thực thi, nó tạo ra kết quả sau:
Department Id = 1, Department Name = Account
Department Id = 2, Department Name = Sales
Department Id = 3, Department Name = Marketing
Press any key to continue.
Tập dữ liệu cung cấp một biểu diễn dữ liệu cực kỳ hữu ích trong bộ nhớ và được sử dụng cho một loạt các ứng dụng dựa trên dữ liệu. LINQ to Dataset là một trong những công nghệ của LINQ to ADO.NET tạo điều kiện cho việc thực hiện các truy vấn trên dữ liệu của Dataset một cách dễ dàng và nâng cao năng suất.
Giới thiệu LINQ cho tập dữ liệu
LINQ to Dataset đã làm cho nhiệm vụ truy vấn trở nên đơn giản đối với các nhà phát triển. Họ không cần phải viết các truy vấn bằng một ngôn ngữ truy vấn cụ thể thay vào đó điều tương tự có thể được viết bằng ngôn ngữ lập trình. LINQ to Dataset cũng có thể sử dụng để truy vấn nơi dữ liệu được tổng hợp từ nhiều nguồn dữ liệu. Điều này cũng không cần bất kỳ trình cung cấp LINQ nào giống như LINQ to SQL và LINQ to XML để truy cập dữ liệu từ trong bộ sưu tập bộ nhớ.
Dưới đây là một ví dụ đơn giản về truy vấn LINQ tới Tập dữ liệu, trong đó nguồn dữ liệu được lấy trước và sau đó tập dữ liệu được lấp đầy bằng hai bảng dữ liệu. Mối quan hệ được thiết lập giữa cả hai bảng và truy vấn LINQ được tạo dựa trên cả hai bảng bằng mệnh đề nối. Cuối cùng, vòng lặp foreach được sử dụng để hiển thị kết quả mong muốn.
C #
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace LINQtoDataset {
class Program {
static void Main(string[] args) {
string connectString = System.Configuration.ConfigurationManager.ConnectionStrings["LinqToSQLDBConnectionString"].ToString();
string sqlSelect = "SELECT * FROM Department;" + "SELECT * FROM Employee;";
// Create the data adapter to retrieve data from the database
SqlDataAdapter da = new SqlDataAdapter(sqlSelect, connectString);
// Create table mappings
da.TableMappings.Add("Table", "Department");
da.TableMappings.Add("Table1", "Employee");
// Create and fill the DataSet
DataSet ds = new DataSet();
da.Fill(ds);
DataRelation dr = ds.Relations.Add("FK_Employee_Department",
ds.Tables["Department"].Columns["DepartmentId"],
ds.Tables["Employee"].Columns["DepartmentId"]);
DataTable department = ds.Tables["Department"];
DataTable employee = ds.Tables["Employee"];
var query = from d in department.AsEnumerable()
join e in employee.AsEnumerable()
on d.Field<int>("DepartmentId") equals
e.Field<int>("DepartmentId")
select new {
EmployeeId = e.Field<int>("EmployeeId"),
Name = e.Field<string>("Name"),
DepartmentId = d.Field<int>("DepartmentId"),
DepartmentName = d.Field<string>("Name")
};
foreach (var q in query) {
Console.WriteLine("Employee Id = {0} , Name = {1} , Department Name = {2}",
q.EmployeeId, q.Name, q.DepartmentName);
}
Console.WriteLine("\nPress any key to continue.");
Console.ReadKey();
}
}
}
VB
Imports System.Data.SqlClient
Imports System.Linq
Module LinqToDataSet
Sub Main()
Dim connectString As String = System.Configuration.ConfigurationManager.ConnectionStrings("LinqToSQLDBConnectionString").ToString()
Dim sqlSelect As String = "SELECT * FROM Department;" + "SELECT * FROM Employee;"
Dim sqlCnn As SqlConnection = New SqlConnection(connectString)
sqlCnn.Open()
Dim da As New SqlDataAdapter
da.SelectCommand = New SqlCommand(sqlSelect, sqlCnn)
da.TableMappings.Add("Table", "Department")
da.TableMappings.Add("Table1", "Employee")
Dim ds As New DataSet()
da.Fill(ds)
Dim dr As DataRelation = ds.Relations.Add("FK_Employee_Department", ds.Tables("Department").Columns("DepartmentId"), ds.Tables("Employee").Columns("DepartmentId"))
Dim department As DataTable = ds.Tables("Department")
Dim employee As DataTable = ds.Tables("Employee")
Dim query = From d In department.AsEnumerable()
Join e In employee.AsEnumerable() On d.Field(Of Integer)("DepartmentId") Equals
e.Field(Of Integer)("DepartmentId")
Select New Person With { _
.EmployeeId = e.Field(Of Integer)("EmployeeId"),
.EmployeeName = e.Field(Of String)("Name"),
.DepartmentId = d.Field(Of Integer)("DepartmentId"),
.DepartmentName = d.Field(Of String)("Name")
}
For Each e In query
Console.WriteLine("Employee Id = {0} , Name = {1} , Department Name = {2}", e.EmployeeId, e.EmployeeName, e.DepartmentName)
Next
Console.WriteLine(vbLf & "Press any key to continue.")
Console.ReadKey()
End Sub
Class Person
Public Property EmployeeId As Integer
Public Property EmployeeName As String
Public Property DepartmentId As Integer
Public Property DepartmentName As String
End Class
End Module
Khi đoạn mã trên của C # hoặc VB được biên dịch và thực thi, nó tạo ra kết quả sau:
Employee Id = 1, Name = William, Department Name = Account
Employee Id = 2, Name = Benjamin, Department Name = Account
Employee Id = 3, Name = Miley, Department Name = Sales
Press any key to continue.
Truy vấn Dataset bằng LinQ to Dataset
Trước khi bắt đầu truy vấn Tập dữ liệu bằng LINQ to Dataset, điều quan trọng là phải tải dữ liệu vào Dataset và điều này được thực hiện bằng cách sử dụng lớp DataAdapter hoặc bằng LINQ to SQL. Công thức các truy vấn sử dụng LINQ to Dataset khá giống với việc tạo các truy vấn bằng cách sử dụng LINQ cùng với các nguồn dữ liệu hỗ trợ LINQ khác.
Truy vấn một bảng
Trong truy vấn bảng đơn sau đây, tất cả các đơn đặt hàng trực tuyến được thu thập từ SalesOrderHeaderTtable và sau đó ID đơn đặt hàng, ngày đặt hàng cũng như số đơn đặt hàng được hiển thị dưới dạng đầu ra.
C#
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace LinqToDataset {
class SingleTable {
static void Main(string[] args) {
string connectString = System.Configuration.ConfigurationManager.ConnectionStrings["LinqToSQLDBConnectionString"].ToString();
string sqlSelect = "SELECT * FROM Department;";
// Create the data adapter to retrieve data from the database
SqlDataAdapter da = new SqlDataAdapter(sqlSelect, connectString);
// Create table mappings
da.TableMappings.Add("Table", "Department");
// Create and fill the DataSet
DataSet ds = new DataSet();
da.Fill(ds);
DataTable department = ds.Tables["Department"];
var query = from d in department.AsEnumerable()
select new {
DepartmentId = d.Field<int>("DepartmentId"),
DepartmentName = d.Field<string>("Name")
};
foreach (var q in query) {
Console.WriteLine("Department Id = {0} , Name = {1}",
q.DepartmentId, q.DepartmentName);
}
Console.WriteLine("\nPress any key to continue.");
Console.ReadKey();
}
}
}
VB
Imports System.Data.SqlClient
Imports System.Linq
Module LinqToDataSet
Sub Main()
Dim connectString As String = System.Configuration.ConfigurationManager.ConnectionStrings("LinqToSQLDBConnectionString").ToString()
Dim sqlSelect As String = "SELECT * FROM Department;"
Dim sqlCnn As SqlConnection = New SqlConnection(connectString)
sqlCnn.Open()
Dim da As New SqlDataAdapter
da.SelectCommand = New SqlCommand(sqlSelect, sqlCnn)
da.TableMappings.Add("Table", "Department")
Dim ds As New DataSet()
da.Fill(ds)
Dim department As DataTable = ds.Tables("Department")
Dim query = From d In department.AsEnumerable()
Select New DepartmentDetail With {
.DepartmentId = d.Field(Of Integer)("DepartmentId"),
.DepartmentName = d.Field(Of String)("Name")
}
For Each e In query
Console.WriteLine("Department Id = {0} , Name = {1}", e.DepartmentId, e.DepartmentName)
Next
Console.WriteLine(vbLf & "Press any key to continue.")
Console.ReadKey()
End Sub
Public Class DepartmentDetail
Public Property DepartmentId As Integer
Public Property DepartmentName As String
End Class
End Module
Khi đoạn mã trên của C # hoặc VB được biên dịch và thực thi, nó tạo ra kết quả sau:
Department Id = 1, Name = Account
Department Id = 2, Name = Sales
Department Id = 3, Name = Pre-Sales
Department Id = 4, Name = Marketing
Press any key to continue.
LINQ to XML cung cấp khả năng truy cập dễ dàng vào tất cả các chức năng của LINQ như toán tử truy vấn tiêu chuẩn, giao diện lập trình, v.v. Được tích hợp trong khung công tác .NET, LINQ to XML cũng sử dụng tốt nhất các chức năng khung công tác .NET như gỡ lỗi, kiểm tra thời gian biên dịch, nhập mạnh và nhiều điều khác để nói.
Giới thiệu LINQ sang XML
Trong khi sử dụng LINQ sang XML, việc tải các tài liệu XML vào bộ nhớ rất dễ dàng và dễ dàng hơn là truy vấn và sửa đổi tài liệu. Cũng có thể lưu các tài liệu XML hiện có trong bộ nhớ vào đĩa và tuần tự hóa chúng. Nó giúp nhà phát triển không cần phải học ngôn ngữ truy vấn XML hơi phức tạp.
LINQ to XML có sức mạnh của nó trong không gian tên System.Xml.Linq. Điều này có tất cả 19 lớp cần thiết để làm việc với XML. Những lớp này là những lớp sau.
- XAttribute
- XCData
- XComment
- XContainer
- XDeclaration
- XDocument
- XDocumentType
- XElement
- XName
- XNamespace
- XNode
- XNodeDocumentOrderComparer
- XNodeEqualityComparer
- XObject
- XObjectChange
- XObjectChangeEventArgs
- XObjectEventHandler
- XProcessingInstruction
- XText
Đọc tệp XML bằng LINQ
C #
using System;
using System.Collections.Generic;
using System.Linq;
using System.Xml.Linq;
namespace LINQtoXML {
class ExampleOfXML {
static void Main(string[] args) {
string myXML = @"<Departments>
<Department>Account</Department>
<Department>Sales</Department>
<Department>Pre-Sales</Department>
<Department>Marketing</Department>
</Departments>";
XDocument xdoc = new XDocument();
xdoc = XDocument.Parse(myXML);
var result = xdoc.Element("Departments").Descendants();
foreach (XElement item in result) {
Console.WriteLine("Department Name - " + item.Value);
}
Console.WriteLine("\nPress any key to continue.");
Console.ReadKey();
}
}
}
VB
Imports System.Collections.Generic
Imports System.Linq
Imports System.Xml.Linq
Module Module1
Sub Main(ByVal args As String())
Dim myXML As String = "<Departments>" & vbCr & vbLf &
"<Department>Account</Department>" & vbCr & vbLf &
"<Department>Sales</Department>" & vbCr & vbLf &
"<Department>Pre-Sales</Department>" & vbCr & vbLf &
"<Department>Marketing</Department>" & vbCr & vbLf &
"</Departments>"
Dim xdoc As New XDocument()
xdoc = XDocument.Parse(myXML)
Dim result = xdoc.Element("Departments").Descendants()
For Each item As XElement In result
Console.WriteLine("Department Name - " + item.Value)
Next
Console.WriteLine(vbLf & "Press any key to continue.")
Console.ReadKey()
End Sub
End Module
Khi đoạn mã trên của C # hoặc VB được biên dịch và thực thi, nó tạo ra kết quả sau:
Department Name - Account
Department Name - Sales
Department Name - Pre-Sales
Department Name - Marketing
Press any key to continue.
Thêm nút mới
C #
using System;
using System.Collections.Generic;
using System.Linq;
using System.Xml.Linq;
namespace LINQtoXML {
class ExampleOfXML {
static void Main(string[] args) {
string myXML = @"<Departments>
<Department>Account</Department>
<Department>Sales</Department>
<Department>Pre-Sales</Department>
<Department>Marketing</Department>
</Departments>";
XDocument xdoc = new XDocument();
xdoc = XDocument.Parse(myXML);
//Add new Element
xdoc.Element("Departments").Add(new XElement("Department", "Finance"));
//Add new Element at First
xdoc.Element("Departments").AddFirst(new XElement("Department", "Support"));
var result = xdoc.Element("Departments").Descendants();
foreach (XElement item in result) {
Console.WriteLine("Department Name - " + item.Value);
}
Console.WriteLine("\nPress any key to continue.");
Console.ReadKey();
}
}
}
VB
Imports System.Collections.Generic
Imports System.Linq
Imports System.Xml.Linq
Module Module1
Sub Main(ByVal args As String())
Dim myXML As String = "<Departments>" & vbCr & vbLf &
"<Department>Account</Department>" & vbCr & vbLf &
"<Department>Sales</Department>" & vbCr & vbLf &
"<Department>Pre-Sales</Department>" & vbCr & vbLf &
"<Department>Marketing</Department>" & vbCr & vbLf &
"</Departments>"
Dim xdoc As New XDocument()
xdoc = XDocument.Parse(myXML)
xdoc.Element("Departments").Add(New XElement("Department", "Finance"))
xdoc.Element("Departments").AddFirst(New XElement("Department", "Support"))
Dim result = xdoc.Element("Departments").Descendants()
For Each item As XElement In result
Console.WriteLine("Department Name - " + item.Value)
Next
Console.WriteLine(vbLf & "Press any key to continue.")
Console.ReadKey()
End Sub
End Module
Khi đoạn mã trên của C # hoặc VB được biên dịch và thực thi, nó tạo ra kết quả sau:
Department Name - Support
Department Name - Account
Department Name - Sales
Department Name - Pre-Sales
Department Name - Marketing
Department Name - Finance
Press any key to continue.
Xóa nút cụ thể
C #
using System;
using System.Collections.Generic;
using System.Linq;
using System.Xml.Linq;
namespace LINQtoXML {
class ExampleOfXML {
static void Main(string[] args) {
string myXML = @"<Departments>
<Department>Support</Department>
<Department>Account</Department>
<Department>Sales</Department>
<Department>Pre-Sales</Department>
<Department>Marketing</Department>
<Department>Finance</Department>
</Departments>";
XDocument xdoc = new XDocument();
xdoc = XDocument.Parse(myXML);
//Remove Sales Department
xdoc.Descendants().Where(s =>s.Value == "Sales").Remove();
var result = xdoc.Element("Departments").Descendants();
foreach (XElement item in result) {
Console.WriteLine("Department Name - " + item.Value);
}
Console.WriteLine("\nPress any key to continue.");
Console.ReadKey();
}
}
}
VB
Imports System.Collections.Generic
Imports System.Linq
Imports System.Xml.Linq
Module Module1
Sub Main(args As String())
Dim myXML As String = "<Departments>" & vbCr & vbLf &
"<Department>Support</Department>" & vbCr & vbLf &
"<Department>Account</Department>" & vbCr & vbLf &
"<Department>Sales</Department>" & vbCr & vbLf &
"<Department>Pre-Sales</Department>" & vbCr & vbLf &
"<Department>Marketing</Department>" & vbCr & vbLf &
"<Department>Finance</Department>" & vbCr & vbLf &
"</Departments>"
Dim xdoc As New XDocument()
xdoc = XDocument.Parse(myXML)
xdoc.Descendants().Where(Function(s) s.Value = "Sales").Remove()
Dim result = xdoc.Element("Departments").Descendants()
For Each item As XElement In result
Console.WriteLine("Department Name - " + item.Value)
Next
Console.WriteLine(vbLf & "Press any key to continue.")
Console.ReadKey()
End Sub
End Module
Khi đoạn mã trên của C # hoặc VB được biên dịch và thực thi, nó tạo ra kết quả sau:
Department Name - Support
Department Name - Account
Department Name - Pre-Sales
Department Name - Marketing
Department Name - Finance
Press any key to continue.
Là một phần của Khung thực thể ADO.NET, LINQ to Entities linh hoạt hơn LINQ to SQL, nhưng không phổ biến nhiều vì độ phức tạp và thiếu các tính năng chính. Tuy nhiên, nó không có những hạn chế của LINQ to SQL là chỉ cho phép truy vấn dữ liệu trong cơ sở dữ liệu máy chủ SQL vì LINQ to Entities tạo điều kiện truy vấn dữ liệu trong một số lượng lớn các nhà cung cấp dữ liệu như Oracle, MySQL, v.v.
Hơn nữa, nó đã nhận được sự hỗ trợ lớn từ ASP.Net theo nghĩa là người dùng có thể sử dụng quyền kiểm soát nguồn dữ liệu để thực hiện truy vấn qua LINQ tới các Đối tượng và tạo điều kiện ràng buộc các kết quả mà không cần thêm mã hóa.
LINQ to Entities vì những ưu điểm này đã trở thành cơ chế tiêu chuẩn cho việc sử dụng LINQ trên cơ sở dữ liệu ngày nay. Với LINQ to Entities cũng có thể thay đổi chi tiết dữ liệu được truy vấn và cam kết cập nhật hàng loạt một cách dễ dàng. Sự thật hấp dẫn nhất về LINQ to Entities là nó có cùng cú pháp như SQL và thậm chí có cùng một nhóm các toán tử truy vấn tiêu chuẩn như Join, Select, OrderBy, v.v.
Quy trình tạo và thực thi truy vấn LINQ tới thực thể
Xây dựng một ObjectQuery ví dụ từ một ObjectContext (Kết nối thực thể)
Soạn một truy vấn trong C # hoặc Visual Basic (VB) bằng cách sử dụng phiên bản mới được tạo
Chuyển đổi các toán tử truy vấn chuẩn của LINQ cũng như các biểu thức LINQ thành cây lệnh
Thực thi truy vấn chuyển trực tiếp bất kỳ ngoại lệ nào gặp phải cho máy khách
Trả lại cho khách hàng tất cả các kết quả truy vấn
ObjectContext đây là lớp chính cho phép tương tác với Entity Data Modelhay nói cách khác hoạt động như một cầu nối kết nối LINQ với cơ sở dữ liệu. Cây lệnh ở đây là biểu diễn truy vấn với khả năng tương thích với khung thực thể.
Mặt khác, Entity Framework thực sự là Object Relational Mapperviết tắt thường là ORM bởi các nhà phát triển thực hiện việc tạo ra các đối tượng nghiệp vụ cũng như các thực thể theo bảng cơ sở dữ liệu và tạo điều kiện cho các hoạt động cơ bản khác nhau như tạo, cập nhật, xóa và đọc. Hình minh họa sau đây cho thấy khung thực thể và các thành phần của nó.
Ví dụ về THÊM, CẬP NHẬT và XÓA bằng LINQ với Mô hình thực thể
Đầu tiên hãy thêm Mô hình thực thể bằng cách làm theo các bước dưới đây.
Step 1- Nhấp chuột phải vào dự án và nhấp vào thêm mục mới sẽ mở ra cửa sổ như bên dưới. Chọn Mô hình Dữ liệu Thực thể ADO.NET và chỉ định tên và nhấp vào Thêm.
Step 2 - Chọn Generate from database.
Step 3 - Chọn Kết nối cơ sở dữ liệu từ trình đơn thả xuống.
Step 4 - Chọn tất cả các bảng.
Bây giờ hãy viết đoạn mã sau.
using DataAccess;
using System;
using System.Linq;
namespace LINQTOSQLConsoleApp {
public class LinqToEntityModel {
static void Main(string[] args) {
using (LinqToSQLDBEntities context = new LinqToSQLDBEntities()) {
//Get the List of Departments from Database
var departmentList = from d in context.Departments
select d;
foreach (var dept in departmentList) {
Console.WriteLine("Department Id = {0} , Department Name = {1}",
dept.DepartmentId, dept.Name);
}
//Add new Department
DataAccess.Department department = new DataAccess.Department();
department.Name = "Support";
context.Departments.Add(department);
context.SaveChanges();
Console.WriteLine("Department Name = Support is inserted in Database");
//Update existing Department
DataAccess.Department updateDepartment = context.Departments.FirstOrDefault(d ⇒d.DepartmentId == 1);
updateDepartment.Name = "Account updated";
context.SaveChanges();
Console.WriteLine("Department Name = Account is updated in Database");
//Delete existing Department
DataAccess.Department deleteDepartment = context.Departments.FirstOrDefault(d ⇒d.DepartmentId == 3);
context.Departments.Remove(deleteDepartment);
context.SaveChanges();
Console.WriteLine("Department Name = Pre-Sales is deleted in Database");
//Get the Updated List of Departments from Database
departmentList = from d in context.Departments
select d;
foreach (var dept in departmentList) {
Console.WriteLine("Department Id = {0} , Department Name = {1}",
dept.DepartmentId, dept.Name);
}
}
Console.WriteLine("\nPress any key to continue.");
Console.ReadKey();
}
}
}
Khi đoạn mã trên được biên dịch và thực thi, nó tạo ra kết quả sau:
Thuật ngữ 'biểu thức Lambda' bắt nguồn từ tên của nó từ phép tính 'lambda', đến lượt nó là một ký hiệu toán học được áp dụng để xác định các hàm. Các biểu thức Lambda như một phần thực thi của phương trình LINQ dịch logic theo một cách tại thời điểm chạy để nó có thể chuyển đến nguồn dữ liệu một cách thuận tiện. Tuy nhiên, các biểu thức lambda không chỉ giới hạn để tìm ứng dụng trong LINQ.
Các biểu thức này được thể hiện bằng cú pháp sau:
(Input parameters) ⇒ Expression or statement block
Đây là một ví dụ về biểu thức lambda -
y ⇒ y * y
Biểu thức trên chỉ định một tham số có tên là y và giá trị đó của y là bình phương. Tuy nhiên, không thể thực thi một biểu thức lambda ở dạng này. Ví dụ về biểu thức lambda trong C # được hiển thị bên dưới.
C #
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace lambdaexample {
class Program {
delegate int del(int i);
static void Main(string[] args) {
del myDelegate = y ⇒ y * y;
int j = myDelegate(5);
Console.WriteLine(j);
Console.ReadLine();
}
}
}
VB
Module Module1
Private Delegate Function del(ByVal i As Integer) As Integer
Sub Main(ByVal args As String())
Dim myDelegate As del = Function(y) y * y
Dim j As Integer = myDelegate(5)
Console.WriteLine(j)
Console.ReadLine()
End Sub
End Module
Khi đoạn mã trên của C # hoặc VB được biên dịch và thực thi, nó tạo ra kết quả sau:
25
Biểu thức Lambda
Vì biểu thức trong cú pháp của biểu thức lambda được hiển thị ở trên nằm ở phía bên phải, chúng còn được gọi là biểu thức lambda.
Async Lambdas
Biểu thức lambda được tạo bằng cách kết hợp xử lý không đồng bộ bằng cách sử dụng từ khóa async được gọi là lambdas không đồng bộ. Dưới đây là một ví dụ về lambda không đồng bộ.
Func<Task<string>> getWordAsync = async()⇒ “hello”;
Lambda trong toán tử truy vấn chuẩn
Một biểu thức lambda trong toán tử truy vấn được đánh giá giống nhau theo yêu cầu và liên tục hoạt động trên từng phần tử trong chuỗi đầu vào chứ không phải toàn bộ chuỗi. Các nhà phát triển được biểu thức Lambda cho phép đưa logic của riêng họ vào các toán tử truy vấn tiêu chuẩn. Trong ví dụ dưới đây, nhà phát triển đã sử dụng toán tử 'Where' để lấy lại các giá trị lẻ từ danh sách đã cho bằng cách sử dụng biểu thức lambda.
C #
//Get the average of the odd Fibonacci numbers in the series...
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace lambdaexample {
class Program {
static void Main(string[] args) {
int[] fibNum = { 1, 1, 2, 3, 5, 8, 13, 21, 34 };
double averageValue = fibNum.Where(num ⇒ num % 2 == 1).Average();
Console.WriteLine(averageValue);
Console.ReadLine();
}
}
}
VB
Module Module1
Sub Main()
Dim fibNum As Integer() = {1, 1, 2, 3, 5, 8, 13, 21, 34}
Dim averageValue As Double = fibNum.Where(Function(num) num Mod 2 = 1).Average()
Console.WriteLine(averageValue)
Console.ReadLine()
End Sub
End Module
Khi đoạn mã trên được biên dịch và thực thi, nó tạo ra kết quả sau:
7.33333333333333
Nhập Suy luận bằng Lambda
Trong C #, kiểu suy luận được sử dụng thuận tiện trong nhiều trường hợp khác nhau và cũng như vậy mà không cần chỉ định kiểu rõ ràng. Tuy nhiên trong trường hợp biểu thức lambda, suy luận kiểu sẽ chỉ hoạt động khi mỗi kiểu đã được chỉ định vì trình biên dịch phải được thỏa mãn. Hãy xem xét ví dụ sau đây.
delegate int Transformer (int i);
Ở đây trình biên dịch sử dụng kiểu suy luận để dựa trên thực tế rằng x là một số nguyên và điều này được thực hiện bằng cách kiểm tra kiểu tham số của Transformer.
Phạm vi biến trong biểu thức Lambda
Có một số quy tắc trong khi sử dụng phạm vi biến trong biểu thức lambda như các biến được khởi tạo trong biểu thức lambda không có nghĩa là hiển thị trong một phương thức bên ngoài. Cũng có một quy tắc rằng một biến được capture không được thu gom trừ khi đại biểu tham chiếu đến biến đó đủ điều kiện cho hành động thu gom rác. Hơn nữa, có một quy tắc cấm một câu lệnh trả về trong một biểu thức lambda gây ra việc trả về một phương thức bao.
Đây là một ví dụ để chứng minh phạm vi biến trong biểu thức lambda.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace lambdaexample {
class Program {
delegate bool D();
delegate bool D2(int i);
class Test {
D del;
D2 del2;
public void TestMethod(int input) {
int j = 0;
// Initialize the delegates with lambda expressions.
// Note access to 2 outer variables.
// del will be invoked within this method.
del = () ⇒ { j = 10; return j > input; };
// del2 will be invoked after TestMethod goes out of scope.
del2 = (x) ⇒ { return x == j; };
// Demonstrate value of j:
// The delegate has not been invoked yet.
Console.WriteLine("j = {0}", j); // Invoke the delegate.
bool boolResult = del();
Console.WriteLine("j = {0}. b = {1}", j, boolResult);
}
static void Main() {
Test test = new Test();
test.TestMethod(5);
// Prove that del2 still has a copy of
// local variable j from TestMethod.
bool result = test.del2(10);
Console.WriteLine(result);
Console.ReadKey();
}
}
}
}
Khi đoạn mã trên được biên dịch và thực thi, nó tạo ra kết quả sau:
j = 0
j = 10. b = True
True
Cây biểu hiện
Biểu thức lambda được sử dụng trong Expression Treexây dựng rộng rãi. Một cây biểu thức cung cấp mã trong một cấu trúc dữ liệu giống như một cây trong đó mỗi nút chính nó là một biểu thức giống như một lệnh gọi phương thức hoặc có thể là một phép toán nhị phân như x <y. Dưới đây là một ví dụ về cách sử dụng biểu thức lambda để xây dựng một cây biểu thức.
Tuyên bố Lambda
Ngoài ra còn có statement lambdasbao gồm hai hoặc ba câu lệnh, nhưng không được sử dụng trong việc xây dựng cây biểu thức. Một câu lệnh trả về phải được viết trong một câu lệnh lambda.
Cú pháp của câu lệnh lambda
(params)⇒ {statements}
Ví dụ về câu lệnh lambda
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Linq.Expressions;
namespace lambdaexample {
class Program {
static void Main(string[] args) {
int[] source = new[] { 3, 8, 4, 6, 1, 7, 9, 2, 4, 8 };
foreach (int i in source.Where(x ⇒
{
if (x <= 3)
return true;
else if (x >= 7)
return true;
return false;
}
))
Console.WriteLine(i);
Console.ReadLine();
}
}
}
Khi đoạn mã trên được biên dịch và thực thi, nó tạo ra kết quả sau:
3
8
1
7
9
2
8
Lambdas được sử dụng làm đối số trong các truy vấn LINQ dựa trên các phương thức và không bao giờ được phép có một vị trí ở phía bên trái của các toán tử như is hoặc là asgiống như các phương pháp ẩn danh. Mặc dù, các biểu thức Lambda rất giống với các phương thức ẩn danh, nhưng chúng không bị hạn chế chỉ được sử dụng làm đại biểu.
Những điểm cần nhớ khi sử dụng biểu thức lambda
Một biểu thức lambda có thể trả về một giá trị và có thể có các tham số.
Các tham số có thể được định nghĩa theo vô số cách với biểu thức lambda.
Nếu có một câu lệnh duy nhất trong một biểu thức lambda thì không cần dấu ngoặc nhọn trong khi nếu có nhiều câu lệnh, thì dấu ngoặc nhọn cũng như giá trị trả về là điều cần thiết để viết.
Với biểu thức lambda, có thể truy cập các biến có mặt bên ngoài khối biểu thức lambda bằng một tính năng được gọi là bao đóng. Việc sử dụng đóng cửa nên được thực hiện một cách thận trọng để tránh bất kỳ vấn đề nào.
Không thể thực thi bất kỳ mã không an toàn nào bên trong bất kỳ biểu thức lambda nào.
Biểu thức Lambda không được sử dụng ở phía bên trái của toán tử.
Là một tập hợp các phần mở rộng .NET framework, LINQ là cơ chế được các nhà phát triển ASP.NET ưa thích để truy cập dữ liệu. ASP.NET 3.5 có công cụ điều khiển LINQDataSource tích hợp cho phép sử dụng LINQ dễ dàng trong ASP.NET. ASP.NET sử dụng điều khiển nêu trên làm nguồn dữ liệu. Các dự án trong cuộc sống thực hầu hết bao gồm các trang web hoặc ứng dụng windows và vì vậy để hiểu rõ hơn khái niệm LINQ với ASP.NET, hãy bắt đầu với việc tạo một trang web ASP.NET sử dụng các tính năng của LINQ.
Đối với điều này, điều cần thiết là phải cài đặt Visual Studio và .NET framework trên hệ thống của bạn. Khi bạn đã mở Visual Studio, hãy đi tới Tệp → Mới → Trang web. Một cửa sổ bật lên sẽ mở ra như trong hình dưới đây.
Bây giờ, bên dưới các mẫu ở phía bên tay trái, sẽ có hai tùy chọn ngôn ngữ để tạo trang web. ChọnVisual C# và chọn ASP.NET Empty Web Site.
Chọn thư mục mà bạn muốn lưu trang web mới trên hệ thống của mình. Sau đó nhấnOK và như thế Solution Explorerxuất hiện trên màn hình của bạn có chứa tất cả các tệp web. Nhấp chuột phải vào Default.aspx trong Trình khám phá giải pháp và chọn Xem trong Trình duyệt để xem trang web ASP.NET mặc định trong trình duyệt. Ngay sau đó, trang web ASP.NET mới của bạn sẽ mở trong trình duyệt web, như thể hiện trong ảnh chụp màn hình sau.
.aspx trên thực tế là phần mở rộng tệp chính được sử dụng trong các trang web ASP.NET. Visual Studio theo mặc định tạo tất cả các trang cần thiết cho một trang web cơ bản nhưHome page và About Ustrang nơi bạn có thể đặt nội dung của mình một cách thuận tiện. Mã cho trang web được tạo tự động tại đây và bạn cũng có thể xem được.
Kiểm soát LINQDataSource
Nó có thể UPDATE, INSERT và DELETEdữ liệu trong các trang của trang web ASP.NET với sự trợ giúp của điều khiển LINQDataSource. Hoàn toàn không cần đặc tả các lệnh SQL vì điều khiển LINQDataSource sử dụng các lệnh được tạo động cho các hoạt động như vậy.
Điều khiển cho phép người dùng sử dụng LINQ trong trang web ASP.NET một cách thuận tiện bằng cách cài đặt thuộc tính trong văn bản đánh dấu. LINQDataSource rất giống với các điều khiển nhưSqlDataSource cũng như ObjectDataSourcevì nó có thể được sử dụng để liên kết các điều khiển ASP.NET khác có trên một trang với nguồn dữ liệu. Vì vậy, chúng ta phải có mộtdatabase để giải thích các chức năng khác nhau được điều khiển bởi LINQDataSource.
Trước khi bắt đầu giải thích việc sử dụng điều khiển trong biểu mẫu trang web ASP.NET, điều cần thiết là phải mở Hộp công cụ Microsoft Visual Studio và kéo và thả điều khiển LINQDataSource vào trang .aspx của trang web ASP.NET như hình bên dưới.
Bước tiếp theo là cấu hình LINQDataSource bằng cách chọn tất cả các cột cho hồ sơ nhân viên.
Bây giờ, hãy thêm Điều khiển GridView vào trang .aspx và định cấu hình nó như thể hiện trong hình bên dưới. Điều khiển GridView mạnh mẽ và cung cấp tính linh hoạt để làm việc với dữ liệu. Ngay sau khi cấu hình điều khiển, nó sẽ xuất hiện trong trình duyệt.
Mã có thể được xem ngay bây giờ trên màn hình của bạn cho trang .aspx sẽ là:
<!DOCTYPE html>
<html>
<head runat = "server">
<title></title>
</head>
<body>
<form id = "form1" runat = "server">
<div>
<asp:GridView ID = "GridView1" runat = "server" AutoGenerateColumns = "False"
DataKeyNames = "ContactID" DataSourceID = "LINQDataSource1">
<Columns>
<asp:BoundField DataField = "ContactID" HeaderText = "ContactID"
InsertVisible = "False" ReadOnly="True" SortExpression = "ContactID" />
<asp:CheckBoxField DataField = "NameStyle" HeaderText = "NameStyle"
SortExpression = "NameStyle" />
<asp:BoundField DataField = "Title" HeaderText = "Title" SortExpression = "Title" />
<asp:BoundField DataField = "FirstName" HeaderText = "FirstName"
SortExpression="FirstName" />
<asp:BoundField DataField = "MiddleName" HeaderText = "MiddleName"
SortExpression = "MiddleName" />
<asp:BoundField DataField = "LastName" HeaderText = "LastName"
SortExpression = "LastName" />
<asp:BoundField DataField = "Suffix" HeaderText = "Suffix"
SortExpression = "Suffix" />
<asp:BoundField DataField = "EmailAddress" HeaderText = "EmailAddress"
SortExpression = "EmailAddress" />
</Columns>
</asp:GridView>
<br />
</div>
<asp:LINQDataSource ID = "LINQDataSource1" runat = "server"
ContextTypeName = "LINQWebApp1.AdventureWorksDataContext" EntityTypeName = ""
TableName = "Contacts">
</asp:LINQDataSource>
</form>
</body>
</html>
Ở đây cần lưu ý rằng điều quan trọng là phải đặt thuộc tính ContextTypeName thành thuộc tính của lớp đại diện cho cơ sở dữ liệu. Ví dụ, ở đây nó được đặt dưới dạng LINQWebApp1.AdventureWorksDataContext vì hành động này sẽ tạo kết nối cần thiết giữa LINQDataSource và cơ sở dữ liệu.
CHÈN, CẬP NHẬT và XÓA dữ liệu trong Trang ASP.NET bằng LINQ
Sau khi hoàn thành tất cả các bước trên một cách nghiêm ngặt, hãy chọn LINQDataSource Tasks từ LINQDataSource Control và chọn tất cả ba hộp để kích hoạt chèn, kích hoạt cập nhật và kích hoạt xóa từ cùng một, như được hiển thị trong ảnh chụp màn hình sau.
Ngay sau đó, đánh dấu khai báo sẽ được hiển thị trên màn hình của bạn như sau.
<asp:LINQDataSource
ContextTypeName = "LINQWebApp1.AdventureWorksDataContext"
TableName = "Contacts"
EnableUpdate = "true"
EnableInsert = "true"
EnableDelete = "true"
ID = "LINQDataSource1"
runat = "server">
</asp:LINQDataSource>
Bây giờ vì có nhiều hàng và cột, tốt hơn nên thêm một điều khiển khác trên biểu mẫu .aspx của bạn có tên là Chế độ xem chi tiết hoặc Điều khiển chính bên dưới điều khiển Chế độ xem lưới để chỉ hiển thị chi tiết của một hàng đã chọn của lưới. Chọn Nhiệm vụ Xem Chi tiết từ điều khiển Xem Chi tiết và chọn các hộp kiểm như hình dưới đây.
Bây giờ, chỉ cần lưu các thay đổi và nhấn Ctrl + F5 để xem trang trong trình duyệt của bạn, nơi bây giờ bạn có thể xóa, cập nhật, chèn bất kỳ bản ghi nào trên điều khiển xem chi tiết.