C#中如何使用EF Core的原始SQL查询带参数?示例是什么?

来源:这里教程网 时间:2026-02-21 17:27:41 作者:

在C#中使用EF Core执行带参数的原始SQL查询,推荐使用 FromSqlRawExecuteSqlRaw 方法,并配合参数化查询来防止SQL注入。下面介绍常见用法和示例。

1. 查询实体数据(FromSqlRaw)

当你想从数据库中查询实体(如映射到某个 DbSet 的表),可以使用 FromSqlRaw 并传入带参数的SQL语句:

var userId = 1;
var users = context.Users
    .FromSqlRaw("SELECT * FROM Users WHERE Id = {0}", userId)
    .ToList();

说明:
{0} 是参数占位符,EF Core 会自动将其替换为安全的参数化形式,避免SQL注入。
支持多个参数,例如:
"SELECT * FROM Users WHERE Age > {0} AND Name LIKE {1}"

2. 使用 SqlParameter(更安全)

对于复杂场景或需要明确指定数据库类型时,可使用 SqlParameter

var nameParam = new SqlParameter("@name", "张%");
var users = context.Users
    .FromSqlRaw("SELECT * FROM Users WHERE Name LIKE @name", nameParam)
    .ToList();

优势: 可以设置参数类型、大小等,更贴近原生SQL控制。

3. 执行非查询语句(ExecuteSqlRaw)

用于执行 INSERT、UPDATE、DELETE 等操作:

var newName = "李四";
var id = 1;
context.Database.ExecuteSqlRaw(
    "UPDATE Users SET Name = {0} WHERE Id = {1}", 
    newName, id);

该方法返回受影响的行数,适用于不返回实体的命令。

4. 使用 FromSqlInterpolated(推荐方式)

EF Core 也支持字符串插值语法 FromSqlInterpolated,更直观且安全:

var age = 18;
var users = context.Users
    .FromSqlInterpolated($"SELECT * FROM Users WHERE Age > {age}")
    .ToList();

内部自动将插值表达式转为参数化查询,兼具可读性与安全性。

基本上就这些常用方式。关键点是:不要拼接SQL字符串,始终使用参数占位符或 SqlParameter 来传参,确保应用安全。

相关推荐