EF Core - Truy vấn SQL

Thực thi truy vấn SQL trong EF Core

Entity Framework Core cung cấp phương thức DbSet.FromSql () để thực thi các truy vấn SQL trong cơ sở dữ liệu bên dưới và nhận kết quả dưới dạng các đối tượng thực thể.

Ví dụ sau minh họa việc thực thi một truy vấn SQL trong cơ sở dữ liệu MS SQL Server

var context = new SchoolContext();

var students = context.Students
                  .FromSql("Select * from Students where Name = 'Bill'")
                  .ToList();

Trong ví dụ trên, phương thức FromSql() được sử dụng sau tập thực thể Student (DbSet <Student >), vì vậy truy vấn SQL được chỉ định phải trả về các bản ghi từ bảng Student. Entity Framework Core sẽ thực hiện truy vấn được xác định đến cơ sở dữ liệu, tức là Select * from Students where Name = 'Bill'  trong ví dụ trên.


Truy vấn có tham số

Phương thức FromSql cho phép các truy vấn có tham số bằng cách sử dụng cú pháp nội suy chuỗi trong C #, như được hiển thị bên dưới.

string name = "Bill";

var context = new SchoolContext();
var students = context.Students
                    .FromSql($"Select * from Students where Name = '{name}'")
                    .ToList();

Sau đây cũng đúng.

string name = "Bill";

var context = new SchoolContext();
var students = context.Students
                    .FromSql("Select * from Students where Name = '{0}'", name)
                    .ToList();

Các ví dụ trên sẽ thực thi truy vấn SQL sau đối với cơ sở dữ liệu SQL Server:

exec sp_executesql N'Select * from Students where Name = ''@p0''
',N'@p0 nvarchar(4000)',@p0=N'Bill'
go

Các toán tử LINQ

Chúng ta cũng có thể sử dụng toán tử LINQ sau một truy vấn bằng phương pháp FromSql.

string name = "Bill";

var context = new SchoolContext();
var students = context.Students
                    .FromSql("Select * from Students where Name = '{0}'", name)
                    .OrderBy(s => s.StudentId)
                    .ToList();

Trong ví dụ trên, EF Core thực hiện truy vấn sau bằng cách kết hợp phương thức FromSql và toán tử OrderBy.

exec sp_executesql N'SELECT [s].[StudentId], [s].[Name]
FROM (
    Select * from Students where Name = ''@p0''
) AS [s]
ORDER BY [s].[StudentId]',N'@p0 nvarchar(4000)',@p0=N'Bill'
go

Hạn chế của FromSql

  1. Các truy vấn SQL phải trả về các thực thể cùng kiểu với kiểu DbSet <T>. ví dụ. truy vấn xác định không thể trả về các thực thể Course nếu FromSql được sử dụng sau Student. Trả về các kiểu đặc biệt từ phương thức FromSql () chứa trong backlog.
  2. Truy vấn SQL phải trả về tất cả các cột của bảng. ví dụ. context.Students.FromSql ("Chọn StudentId, LastName từ Students) .ToList () sẽ ném ra một ngoại lệ.
  3. Truy vấn SQL không thể bao gồm các truy vấn JOIN để lấy dữ liệu liên quan. Sử dụng phương thức Include để tải các thực thể liên quan sau phương thức FromSql ()