EFCore-SQL

EFCore-SQL

需要执行复杂的 SQL 查询或存储过程时,或者当 LINQ 查询无法满足需求时,可以直接执行原始 SQL 查询或命令

非查询语句

使用dbContext对象直接调用Database.ExecuteSqlInterpolated来执行SQL的插入操作,通过$和@字符串修饰符完成对SQL条件的拼接

using (var dbContext = new DBContext())
{
    //ExecuteSqlInterpolated:执行SQL插值
    dbContext.Database.ExecuteSqlInterpolated(
        $@"insert into T Articles (Title, Content, Author) values (@Title, @Content, @Author);");
}

使用内插字符串来完成SQL条件的拼接,不会存在SQL注入的攻击


实体相关查询

使用注册的DbSet属性调用FromSqlInterpolated方法来执行SQL 的查询操作

这个方法的返回值为IQueryable,所以也有延迟执行的特性

同样的,查询语句也可以通过$和@字符串修饰符完成对SQL条件的拼接

也可以通过IQueryable调用相关API对查询进行二次处理

using (var dbContext = new DBContext())
{
    dbContext.Articles.FromSqlInterpolated($@"select * from Articles").ToList();
}

局限性:

  • SQL查询必须返回实体类型对应数据库表的所有列

  • 结果集中的列名必须与属性映射到的列名匹配

  • 只能进行单表查询,不能进行连接查询,但可以在结果后调用Include进行关联数据的获取


任意SQL查询

EFCore中允许把试图或存储过程映射为实体,因此可以把复杂的查询语句写成试图或存储过程,然后再声明对应的实体类,在DbContext中注册对应的DbSet

这种方式不推荐使用,因这种类型会混淆实体类

ADO.NET

因为EFCore是基于ADO.NET封装,所以我们可以直接调用其方法获取数据库连接对象

然后使用原始ADO.NET的方法对数据库发送原始SQL语句

Dapper

推荐使用Dapper执行复杂的数据库查询操作