EF Core 作为 Entity Framework 的开源实现,提供了丰富的 ORM 功能,但有时需要执行复杂的或原始的数据库操作,此时使用原生 SQL 是一个有效的选择。
何时使用原生 SQL
使用原生 SQL 可以解决以下场景:
执行复杂的查询,例如嵌套子查询或使用特定数据库函数。
访问 EF Core 实体模型中不可用的数据库对象,如存储过程或表值函数。
进行大规模数据插入或更新,提升性能。
执行原生 SQL
在 EF Core 中执行原生 SQL 有多种方式,最常见的是使用 FromSqlRaw
和 FromSqlInterpolated
:
// 使用 FromSqlRaw
var results = context.MyEntities.FromSqlRaw("SELECT * FROM MyTable").ToList();
// 使用 FromSqlInterpolated
var results = context.MyEntities.FromSqlInterpolated($"SELECT * FROM MyTable WHERE Name LIKE '{filter}'").ToList();
注意:使用原生 SQL 时,需要小心 SQL 注入攻击,建议使用参数化查询或其他安全机制来防御。
返回实体或投影
EF Core 允许将原生 SQL 查询结果映射到实体或投影类型,从而简化结果处理:
// 映射到实体类型
var results = context.MyEntities.FromSqlRaw("SELECT * FROM MyTable")
.AsEnumerable()
.Select(e => new { Id = e["Id"], Name = e["Name"] });
// 映射到投影类型
var results = context.MyEntities.FromSqlRaw("SELECT Id, Name FROM MyTable")
.Select(e => new MyProjection { Id = e.Id, Name = e.Name });
性能注意事项
原生 SQL 可以提供更好的性能,但应谨慎使用以下原因:
EF Core 无法跟踪原生 SQL 查询的结果,因此无法自动更新或删除实体。
原生 SQL 绕过了 EF Core 的映射和验证逻辑,可能导致未定义的行为或异常。
原生 SQL 可能会受到数据库方言的影响,导致在不同数据库上产生不同的结果。
EF Core 执行原生 SQL 是扩展数据库操作能力的强大工具。通过小心使用和了解其限制,开发者可以提高应用程序的性能和灵活性。