推荐使用 ef.functions.like() 进行模糊查询,它能正确翻译为 sql like 并支持通配符和转义;需对用户输入手动转义以避免误匹配;不区分大小写时可结合 tolower() 或依赖数据库排序规则;contains/startswith/endswith 更简洁但灵活性不足。

EF Core 中使用 LIKE 进行模糊查询,推荐用 EF.Functions.Like(),它能正确翻译为 SQL 的 LIKE 表达式,并支持数据库原生的通配符和转义逻辑。
基本用法:字符串字段匹配
直接在 Where 中调用 EF.Functions.Like(),第一个参数是待查字段,第二个是带通配符的模式字符串:
// 查找 Name 以 "张" 开头的用户
var users = context.Users
.Where(u => EF.Functions.Like(u.Name, "张%"))
.ToList();
生成的 SQL 类似:WHERE [Name] LIKE N'张%'。注意:%(任意多字符)、_(单个字符)等通配符由数据库解释,不是 C# 字符串处理。
安全处理用户输入:避免通配符被误用
如果搜索关键词来自用户(如搜索框),需手动转义通配符,否则可能产生非预期匹配(例如用户搜 "100%",会变成“以 100 开头的任意内容”):
// 将 % _ [ 转义为字面量,并指定转义符为
string keyword = "100%";
string escaped = keyword.Replace("\", "\\")
.Replace("%", "\%")
.Replace("_", "\_")
.Replace("[", "\[");
var results = context.Products
.Where(p => EF.Functions.Like(p.Description, $"%{escaped}%", "\"))
.ToList();
第三个参数 "\" 指定转义符,SQL 中会生成 LIKE '%100%' ESCAPE '',确保 % 被当作普通字符。
不区分大小写的模糊匹配(按需)
多数数据库(如 SQL Server、PostgreSQL)默认 LIKE 区分大小写取决于列排序规则。若需强制不区分大小写,可统一转小写:
- 用
ToLower()(注意:部分提供程序会将其转为 SQL 的LOWER(),但需确认是否走索引) - 更稳妥方式是依赖数据库排序规则,或在查询前确保字段和模式都小写
// 推荐(假设数据库排序规则支持)
.Where(u => EF.Functions.Like(u.Name.ToLower(), "zhang%"))
替代方案对比:Contains/StartsWith/EndsWith
这些方法语义清晰,但底层不一定都生成 LIKE:
-
Contains("abc")→ 通常生成LIKE '%abc%' -
StartsWith("abc")→ 通常生成LIKE 'abc%' -
EndsWith("abc")→ 通常生成LIKE '%abc'
它们更简洁,适合简单场景;但需要自定义通配符位置、使用 _ 或转义时,必须用 EF.Functions.Like()。
基本上就这些。用对 EF.Functions.Like(),既能发挥 SQL 模糊查询能力,又保持 EF Core 的类型安全和可移植性。










