Entity Framework Core系列教程-23-原生SQL查询

在Entity Framework Core中执行原生SQL查询

Entity Framework Core提供了DbSet.FromSql()方法来对基础数据库执行原始SQL查询,并将结果作为实体对象获取。
下面的示例演示如何对MS SQL Server数据库执行原始SQL查询。

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

在上面的示例中,在Student实体集(DbSet<Student>)之后使用FromSql()方法,因此指定的SQL查询必须从Student表返回记录,该记录将在Student实体中进行转换。 Entity Framework Core将执行对数据库的指定查询,即在上面的示例中,从* Name ='Bill’的Student中选择*。

Parameterized Query(参数化查询)

FromSql方法允许使用C#中的字符串插值语法进行参数化查询,如下所示。

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

The following is also valid.
string name = "Bill";
var context = new SchoolContext();
var students = context.Students
                    .FromSql("Select * from Students where Name = '{0}'", name)
                    .ToList();

上面的示例将对SQL Server数据库执行以下SQL查询:

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

LINQ运算符

您还可以在使用FromSql方法的原始查询之后使用LINQ运算符。

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

在上面的示例中,EF Core通过将FromSql方法和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

FromSql的局限性

SQL查询必须返回与DbSet<T>类型相同类型的实体。例如如果在学生之后使用FromSql,则指定的查询无法返回课程实体。从FromSql()方法返回临时类型在待办事项列表中。
SQL查询必须返回表的所有列。例如context.Students.FromSql(“从学生中选择StudentId,LastName).ToList()将引发异常。
SQL查询不能包含JOIN查询以获取相关数据。在FromSql()方法之后,使用Include方法加载相关实体。

posted @ 2020-02-08 20:33  星空天宇  阅读(145)  评论(0编辑  收藏  举报