You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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字符串,必须通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 04:36:01