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执行复杂的数据库查询操作