使用FromSql/FromSqlInterpolated遇问题,求正确用法及适用场景
问题解答
一、关于生成SQL带%{0}%的说明
你看到的"SELECT * FROM Table WHERE ColumnName LIKE '%{0}%'"是正常现象,并非操作错误。
FromSqlInterpolated的核心是实现参数化查询:它不会直接把value的字符串值拼进SQL语句,而是将插值表达式中的{value}替换为参数占位符(如{0}),再把value的值作为独立参数传递给数据库执行。这种设计是为了彻底避免SQL注入风险,同时提升查询的性能与安全性。
如果要实现LIKE '%value%'的模糊查询,当前写法完全有效,EF Core会在执行时自动将参数值与通配符结合完成匹配。你也可以用更直观的写法,效果一致:
string value = "value"; // 写法1:将通配符与参数分开拼接 _dbContext.Set<T>().FromSqlInterpolated($"SELECT * FROM Table WHERE ColumnName LIKE '%' + {value} + '%'"); // 写法2:在参数中包含通配符 string searchPattern = $"%{value}%"; _dbContext.Set<T>().FromSqlInterpolated($"SELECT * FROM Table WHERE ColumnName LIKE {searchPattern}");
二、FromSqlRaw与FromSqlInterpolated的使用场景区分
FromSqlInterpolated
- 优先使用场景:绝大多数需要动态传入参数的原生SQL查询场景
- 核心特点:支持C#字符串插值语法,EF Core自动识别插值变量并转为参数化查询,写法简洁且从根源上杜绝SQL注入,是日常开发的首选。
FromSqlRaw
- 适用场景:
- 需要手动控制参数细节(比如指定参数的SQL类型、长度)时,可直接传入
SqlParameter对象; - SQL字符串是预定义的(如从配置文件读取),带有
@param这类占位符,需要手动绑定参数时; - 需要拼接安全的静态SQL片段(如固定的表名、列名,不会来自用户输入)时;
- 需要手动控制参数细节(比如指定参数的SQL类型、长度)时,可直接传入
- 注意事项:绝对不能直接将用户输入的动态值拼入SQL字符串,必须通过
SqlParameter传递参数,否则会引发严重的SQL注入风险。示例:string value = "value"; var param = new SqlParameter("@searchValue", value); _dbContext.Set<T>().FromSqlRaw("SELECT * FROM Table WHERE ColumnName LIKE '%' + @searchValue + '%'", param);
内容的提问来源于stack exchange,提问作者user7849697
相关产品推荐
相关产品推荐

