Khung thực thể - Truy vấn chiếu
LINQ cho các thực thể
Một trong những khái niệm quan trọng nhất để hiểu LINQ cho các Đối tượng là nó là một ngôn ngữ khai báo. Trọng tâm là xác định thông tin bạn cần, hơn là cách lấy thông tin.
Điều đó có nghĩa là bạn có thể dành nhiều thời gian hơn để làm việc với dữ liệu và ít thời gian hơn để tìm ra mã cơ bản cần thiết để thực hiện các tác vụ như truy cập cơ sở dữ liệu.
Điều quan trọng là phải hiểu rằng các ngôn ngữ khai báo không thực sự loại bỏ bất kỳ quyền kiểm soát nào khỏi nhà phát triển, nhưng nó giúp nhà phát triển tập trung sự chú ý vào những gì quan trọng.
Từ khóa cơ bản của LINQ cho các thực thể
Điều quan trọng là phải biết các từ khóa cơ bản được sử dụng để tạo truy vấn LINQ. Chỉ có một số từ khóa cần nhớ, nhưng bạn có thể kết hợp chúng theo nhiều cách khác nhau để thu được kết quả cụ thể. Danh sách sau đây chứa các từ khóa cơ bản này và cung cấp mô tả đơn giản về từng từ khóa.
Sơ không. | Từ khoá & Mô tả |
---|---|
1 | Ascending Chỉ định rằng thao tác sắp xếp diễn ra từ phần tử nhỏ nhất (hoặc thấp nhất) của một dải ô đến phần tử cao nhất của một dải ô. Đây thường là cài đặt mặc định. Ví dụ: khi thực hiện sắp xếp theo bảng chữ cái, sắp xếp sẽ nằm trong phạm vi từ A đến Z. |
2 | By Chỉ định trường hoặc biểu thức được sử dụng để triển khai một nhóm. Trường hoặc biểu thức xác định một khóa được sử dụng để thực hiện tác vụ nhóm. |
3 | Descending Chỉ định rằng thao tác sắp xếp diễn ra từ phần tử lớn nhất (hoặc cao nhất) của một dải ô đến phần tử thấp nhất của một dải ô. Ví dụ: khi thực hiện sắp xếp theo bảng chữ cái, sắp xếp sẽ nằm trong phạm vi từ Z đến A. |
4 | Equals Được sử dụng giữa các mệnh đề bên trái và bên phải của câu lệnh nối để nối nguồn dữ liệu ngữ cảnh chính với nguồn dữ liệu ngữ cảnh thứ cấp. Trường hoặc biểu thức ở bên trái của từ khóa bằng chỉ định nguồn dữ liệu chính, trong khi trường hoặc biểu thức ở bên phải của từ khóa bằng chỉ định nguồn dữ liệu phụ. |
5 | From Chỉ định nguồn dữ liệu được sử dụng để lấy thông tin cần thiết và xác định một biến phạm vi. Biến này có cùng mục đích với một biến được sử dụng để lặp lại trong vòng lặp. |
6 | Group Sắp xếp đầu ra thành các nhóm bằng cách sử dụng giá trị khóa mà bạn chỉ định. Sử dụng nhiều mệnh đề nhóm để tạo ra nhiều cấp độ tổ chức đầu ra. Thứ tự của các mệnh đề nhóm xác định độ sâu mà tại đó giá trị khóa cụ thể xuất hiện trong thứ tự nhóm. Bạn kết hợp từ khóa này với by để tạo một ngữ cảnh cụ thể. |
7 | In Được sử dụng trong một số cách. Trong trường hợp này, từ khóa xác định nguồn cơ sở dữ liệu ngữ cảnh được sử dụng cho một truy vấn. Khi làm việc với một phép nối, từ khóa in được sử dụng cho từng nguồn cơ sở dữ liệu ngữ cảnh được sử dụng cho phép nối. |
số 8 | Into Chỉ định một số nhận dạng mà bạn có thể sử dụng làm tham chiếu cho các mệnh đề truy vấn LINQ chẳng hạn như tham gia, nhóm và chọn. |
9 | Join Tạo một nguồn dữ liệu duy nhất từ hai nguồn dữ liệu có liên quan, chẳng hạn như trong thiết lập tổng thể / chi tiết. Một phép nối có thể chỉ định một phép nối bên trong, nhóm hoặc phép nối bên trái, với phép nối bên trong làm mặc định. Bạn có thể đọc thêm về tham gia tại msdn.microsoft.com |
10 | Let Xác định một biến phạm vi mà bạn có thể sử dụng để lưu trữ kết quả biểu thức con trong biểu thức truy vấn. Thông thường, biến phạm vi được sử dụng để cung cấp đầu ra được liệt kê bổ sung hoặc để tăng hiệu quả của truy vấn (để một tác vụ cụ thể, chẳng hạn như tìm giá trị chữ thường của một chuỗi, không cần thực hiện nhiều lần). |
11 | On Chỉ định trường hoặc biểu thức được sử dụng để triển khai một phép nối. Trường hoặc biểu thức xác định một phần tử chung cho cả hai nguồn dữ liệu theo ngữ cảnh. |
12 | Orderby Tạo thứ tự sắp xếp cho truy vấn. Bạn có thể thêm từ khóa tăng dần hoặc giảm dần để kiểm soát thứ tự sắp xếp. Sử dụng nhiều mệnh đề theo thứ tự để tạo nhiều cấp độ sắp xếp. Thứ tự của các mệnh đề theo thứ tự xác định thứ tự mà các biểu thức sắp xếp được xử lý, vì vậy việc sử dụng một thứ tự khác sẽ dẫn đến kết quả khác nhau. |
13 | Where Xác định những gì LINQ sẽ truy xuất từ nguồn dữ liệu. Bạn sử dụng một hoặc nhiều biểu thức Boolean để xác định các chi tiết cụ thể của những gì cần truy xuất. Các biểu thức Boolean được phân tách với nhau bằng cách sử dụng && (AND) và || (HOẶC) toán tử. |
14 | Select Xác định kết quả đầu ra từ truy vấn LINQ bằng cách chỉ định thông tin nào sẽ trả về. Câu lệnh này xác định kiểu dữ liệu của các phần tử mà LINQ trả về trong quá trình lặp. |
Phép chiếu
Truy vấn chiếu cải thiện hiệu quả ứng dụng của bạn, bằng cách chỉ truy xuất các trường cụ thể từ cơ sở dữ liệu của bạn.
Sau khi có dữ liệu, bạn có thể chiếu hoặc lọc nó nếu cần để định hình dữ liệu trước khi xuất.
Nhiệm vụ chính của bất kỳ biểu thức LINQ to Entities nào là lấy dữ liệu và cung cấp dữ liệu dưới dạng đầu ra.
Phần “Phát triển LINQ cho các truy vấn đối tượng” của chương này trình bày các kỹ thuật để thực hiện nhiệm vụ cơ bản này.
Chúng ta hãy xem đoạn mã sau trong danh sách học sinh sẽ được truy xuất.
using (var context = new UniContextEntities()) {
var studentList = from s in context.Students select s;
foreach (var student in studentList) {
string name = student.FirstMidName + " " + student.LastName;
Console.WriteLine("ID : {0}, Name: {1}", student.ID, name);
}
}
Đối tượng duy nhất
Để truy xuất một đối tượng sinh viên duy nhất, bạn có thể sử dụng các phương thức liệt kê First () hoặc FirstOrDefault trả về phần tử đầu tiên của một chuỗi. Sự khác biệt giữa First và FirstOrDefault là First () sẽ ném một ngoại lệ, nếu không có dữ liệu kết quả cho các tiêu chí được cung cấp trong khi FirstOrDefault () trả về giá trị mặc định là null, nếu không có dữ liệu kết quả. Trong đoạn mã dưới đây, sinh viên đầu tiên từ danh sách sẽ được truy xuất có tên là Ali.
using (var context = new UniContextEntities()) {
var student = (from s in context.Students where s.FirstMidName
== "Ali" select s).FirstOrDefault<Student>();
string name = student.FirstMidName + " " + student.LastName;
Console.WriteLine("ID : {0}, Name: {1}", student.ID, name);
}
Bạn cũng có thể sử dụng Single () hoặc SingleOrDefault để lấy một đối tượng sinh viên duy nhất trả về một phần tử cụ thể duy nhất của một chuỗi. Trong ví dụ sau, một sinh viên được truy xuất có ID là 2.
using (var context = new UniContextEntities()) {
var student = (from s in context.Students where s.ID
== 2 select s).SingleOrDefault<Student>();
string name = student.FirstMidName + " " + student.LastName;
Console.WriteLine("ID : {0}, Name: {1}", student.ID, name);
Console.ReadKey();
}
Danh sách các đối tượng
Nếu bạn muốn lấy danh sách sinh viên có tên là Ali thì bạn có thể sử dụng phương thức liệt kê ToList ().
using (var context = new UniContextEntities()) {
var studentList = (from s in context.Students where s.FirstMidName
== "Ali" select s).ToList();
foreach (var student in studentList) {
string name = student.FirstMidName + " " + student.LastName;
Console.WriteLine("ID : {0}, Name: {1}", student.ID, name);
}
Console.ReadKey();
}
Đặt hàng
Để truy xuất dữ liệu / danh sách theo bất kỳ thứ tự cụ thể nào, bạn có thể sử dụng từ khóa orderby. Trong đoạn mã sau, đoạn mã danh sách học sinh sẽ được truy xuất theo thứ tự tăng dần.
using (var context = new UniContextEntities()) {
var studentList = (from s in context.Students orderby
s.FirstMidName ascending select s).ToList();
foreach (var student in studentList) {
string name = student.FirstMidName + " " + student.LastName;
Console.WriteLine("ID : {0}, Name: {1}", student.ID, name);
}
Console.ReadKey();
}
Truy vấn khung thực thể chiếu Vs tiêu chuẩn
Giả sử, bạn có một mô hình Sinh viên có chứa ID, FirstMidName, LastName và EnrollmentDate. Nếu bạn muốn trả về danh sách Sinh viên, một truy vấn chuẩn sẽ trả về tất cả các trường. Nhưng nếu bạn chỉ muốn lấy danh sách sinh viên chứa các trường ID, FirstMidName và LastName. Đây là nơi bạn nên sử dụng truy vấn chiếu. Sau đây là ví dụ đơn giản về truy vấn phép chiếu.
using (var context = new UniContextEntities()) {
var studentList = from s in context.Students
orderby s.FirstMidName ascending
where s.FirstMidName == "Ali"
select new {s.ID, s.FirstMidName, s.LastName};
foreach (var student in studentList) {
string name = student.FirstMidName + " " + student.LastName;
Console.WriteLine("ID : {0}, Name: {1}", student.ID, name);
}
Console.ReadKey();
}
Truy vấn chiếu ở trên loại trừ trường Ngày đăng ký. Điều này sẽ làm cho ứng dụng của bạn nhanh hơn nhiều.