EMMET là gì? EMMET là bộ phím tắt, quy tắc và các ph&iacu...
Mình đang xây dựng nhóm "anh Thầy & Đồng bọn (Hỏi đáp, chia sẻ kiến thức)" mục đích để các bạn có một nơi giao lưu trao đổi.
Đội MOD của group và mọi người sẽ hỗ trợ bạn ngay lập tức.
Join ở đây nè: https://www.facebook.com/groups/anhthayvadongbon
Bài viết: Truy vấn trong Entity Framework
Lượt xem: 3369 lượt xem
Bạn có thể xây dựng và thực hiện các truy vấn bằng Entity Framework để lấy dữ liệu từ cơ sở dữ liệu. Entity Framework 6 hỗ trợ các loại truy vấn khác nhau lần lượt chuyển đổi thành truy vấn SQL cho cơ sở dữ liệu.
Entity Framework hỗ trợ ba loại truy vấn:
Truy vấn tích hợp ngôn ngữ (LINQ) là ngôn ngữ truy vấn mạnh mẽ được giới thiệu trong Visual Studio 2008.
Như tên gọi của nó, các truy vấn LINQ-to-Entities hoạt động trên tập thực thể (thuộc tính kiểu DbSet
) để truy cập dữ liệu từ cơ sở dữ liệu. Bạn có thể sử dụng cú pháp phương thức hoặc cú pháp truy vấn LINQ khi truy vấn với EDM.
Truy vấn LINQ-to-Entities sau đây lấy dữ liệu từ bảng Student
trong cơ sở dữ liệu.
Cú pháp phương thức LINQ:
Cú pháp truy vấn LINQ:
Như bạn có thể thấy ở trên, chúng tôi đã tạo một thể hiện của lớp Context SchoolDBEntities
. Bạn nên khởi tạo nó sử dụng using()
để sau đi ra khỏi phạm vi khối using
nó sẽ tự động được hủy và giải phóng bộ nhớ (disposed).
Bạn có thể xem chi tiết về LINQ-to-Entities ở bài viết này: https://dinhnt.com/read/linq-to-entities-trong-entity-framework-920
Entity SQL là một cách khác để tạo một truy vấn. Nó được xử lý trực tiếp bởi Dịch vụ đối tượng của Entity Framework. Nó trả về ObjectQuery thay vì IQueryable.
Bạn cần một đối tượng ObjectContext
để tạo một truy vấn bằng cách sử dụng Entity SQL.
Đoạn mã sau đây cho thấy kết quả truy vấn tương tự như truy vấn LINQ ở trên.
Bạn cũng có thể sử dụng EntityConnection
và EntityCommand
để thực thi Entity SQL như dưới đây:
Bạn có thể thực thi các truy vấn SQL gốc cho cơ sở dữ liệu quan hệ, như được trình bày bên dưới:
Entity Framework cho phép bạn thực hiện các truy vấn SQL cho cơ sở dữ liệu quan hệ.
Các phương thức sau đây có thể được sử dụng để thực thi các truy vấn SQL vào cơ sở dữ liệu bằng Entity Framework 6.x:
Sử dụng phương thức DbSet.SqlQuery()
để viết các truy vấn SQL trả về các thể hiện của thực thể. Các thực thể trả về sẽ được theo dõi bởi Context, như thể chúng được trả về bởi truy vấn LINQ.
Truy vấn trên thực thi câu lệnh SQL Select * from Students
trong cơ sở dữ liệu để trả về tất cả sinh viên và được chuyển đổi thành một danh sách các thực thể Student
. Tên cột trong truy vấn SQL phải khớp với các thuộc tính của kiểu thực thể, nếu không nó sẽ đưa ra một ngoại lệ.
Bạn có thể chỉ định các tham số bằng cách sử dụng đối tượng SqlParameter
, như sau:
Nếu bạn thay đổi tên cột trong truy vấn SQL, thì nó sẽ đưa ra một ngoại lệ vì nó phải khớp với tên cột. Ví dụ sau đây sẽ đưa ra một ngoại lệ.
Phương thức DbSet<TEntity>.SqlQuery()
thực hiện truy vấn SQL chỉ dành cho bảng được ánh xạ với thực thể được chỉ định (ví dụ: DbSet<Student>.SqlQuery()
chỉ trả về kết quả từ bảng Students
tương ứng chứ không phải từ bất kỳ bảng nào khác). Sau đây sẽ ném một ngoại lệ.
Lớp Database
đại diện cho cơ sở dữ liệu và cung cấp phương thức khác nhau để truy vấn cơ sở dữ liệu. Phương thức Database.SqlQuery()
trả về một giá trị của bất kỳ kiểu dữ liệu nào.
Phương thức Database.ExecuteSqlCommnad()
rất hữu ích trong thực hiện các lệnh Insert, Update và Delete.
Eager Loading là quá trình trong đó một truy vấn cho một kiểu thực thể cũng tải các thực thể liên quan như một phần của truy vấn, do đó chúng ta không cần phải thực hiện một truy vấn riêng cho các thực thể liên quan.
Eager Loading được thực hiện bằng cách sử dụng phương thức Include()
.
Trong ví dụ sau sẽ lấy Student có tên "Bill" từ cơ sở dữ liệu kèm theo thông tin Standard của nó bằng phương thức Include()
.
Cú pháp truy vấn LINQ:
Cú pháp phương thức LINQ:
Các truy vấn LINQ ở trên sẽ tạo ra truy vấn SQL sau:
Bạn cũng có thể sử dụng biểu thức lambda LINQ làm tham số trong phương thức Include
. Đối với điều này, hãy sử dụng namespace System.Data.Entity
và sử dụng biểu thức lambda như dưới đây:
Bạn cũng có thể Eager Loading nhiều cấp độ của các thực thể liên quan. Truy vấn sau sẽ tải các thực thể Student
, Standard
và Teacher
:
Hoặc sử dụng biểu thức lambda như dưới đây:
Truy vấn trên sẽ thực hiện truy vấn SQL sau trong cơ sở dữ liệu:
Lazy loading trì hoãn việc tải các dữ liệu liên quan, cho đến khi bạn yêu cầu cụ thể. Lazy loading đối lập hoàn toàn với Eager loading.
Ví dụ, thực thể Student
chứa thực thể StudentAddress
. Trong lazy loading, Context trước tiên tải dữ liệu thực thể Student
từ cơ sở dữ liệu, sau đó nó sẽ tải thực thể StudentAddress
khi chúng ta truy cập thuộc tính StudentAddress
như dưới đây.
Mã được trình bày ở trên sẽ dẫn đến hai truy vấn SQL. Đầu tiên, nó sẽ lấy tất cả các sinh viên:
Sau đó, nó sẽ gửi truy vấn sau đây khi chúng tôi truy cập thuộc tính StudentAddress của đối tượng sinh viên đầu tiên:
Chúng ta có thể vô hiệu hóa lazy loading cho một thực thể cụ thể hoặc một Context. Để tắt lazy loading cho một thuộc tính cụ thể, đừng khai báo từ khóa virtual
. Để tắt lazy loading cho tất cả các thực thể trong Context, thiết lập thuộc tính cấu hình của nó thành false.
Quy tắc lazy loading:
public
, virtual
. Context sẽ KHÔNG lazy loading nếu thuộc tính không được định nghĩa là virtual
.Ở đây bạn sẽ tìm hiểu làm thế nào để tải các thực thể liên quan trong một biểu đồ thực thể rõ ràng.
Ngay cả khi lazy loading bị vô hiệu hóa (trong EF 6), vẫn có thể lazy loading các thực thể liên quan, nhưng nó phải được gọi rõ ràng. Sử dụng phương thức Load()
để tải các thực thể liên quan một cách rõ ràng. Hãy xem xét ví dụ sau.
Trong ví dụ trên, câu lệnh context.Entry(student).Reference(s => s.StudentAddress).Load()
sẽ tải thực thể StudentAddress
. Phương thức Reference()
được sử dụng để lấy một đối tượng của thuộc tính điều hướng tham chiếu được chỉ định và các phương thức Load()
tải nó một cách rõ ràng.
Theo cùng một cách, câu lệnh context.Entry(student).Collection(s => s.Courses).Load()
tải thuộc tính điều hướng danh sách Courses
của thực thể Student
. Phương thức Collection()
nhận một đối tượng đại diện cho thuộc tính điều hướng danh sách.
Phương thức Load()
thực hiện truy vấn SQL trong cơ sở dữ liệu để lấy dữ liệu và lấp đầy các tham chiếu được chỉ định hoặc thuộc tính danh sách trong bộ nhớ, như hình dưới đây.
Bạn cũng có thể viết các truy vấn LINQ-to-Entities để lọc dữ liệu liên quan trước khi tải. Phương thức Query()
cho phép chúng ta viết các truy vấn LINQ thêm cho các đối tượng có liên quan để lọc ra dữ liệu có liên quan.
Trong ví dụ trên, biểu thức .Collection(s => s.StudentCourses).Query()
cho phép chúng tôi viết các truy vấn tiếp theo cho thực thể StudentCourses
.
Nguồn: comdy.vn
Bạn có muốn xác nhận hoàn thành bài học này không?