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 的类型安全和可移植性。
