EF Core Like 模糊查询

发布时间 2023-07-17 22:29:30作者: 可乐加鸡翅

在EF Core 中可用EF.Functions.Like() 、StartWith、Contains、EndsWith 实现模糊查询 

EF.Functions.Like()

 在Entity Framework Core 2.0中增加一个很酷的功能:EF.Functions.Like(),最终解析为SQL中的Like语句,以便于在 LINQ 查询中直接调用。

query = query.Where(d => EF.Functions.Like(d.DeptCode, "%" + condition + "%") || EF.Functions.Like(d.DeptName, "%" + condition + "%"));

 

 EF 中默认提供了StartsWithContainsEndsWith方法用于解决模糊查询

StartsWith:表示字符串的开头是否与指定的字符串匹配;

Contains:表示指定的子串是否出现在此字符串中;

EndsWith:表示字符串的结尾是否与指定的字符串匹配;   

1、直接使用固定字符串

query.Where(d=>d.DeptCode.Contains("H33"))
query.Where(d=>d.DeptCode.StartsWith("H33"))
query.Where(d=>d.DeptName.EndsWith("生产部门"))

转换成SQL:

 WHERE ([d].[DeptCode] LIKE '%H33%')
 WHERE ([d].[DeptCode] LIKE 'H33%')
 WHERE ([d].[DeptName] LIKE N'%生产部门')

 2、使用字符串变量

query.Where(d=>d.DeptCode.Contains(condition)))
query.Where(d=>d.DeptCode.StartsWith(condition))
query.Where(d=>d.DeptName.EndsWith(condition)))

 转换成SQL:

DECLARE @__condition_1 varchar(5) = 'H33';
WHERE ((@__condition_1 LIKE '') OR CHARINDEX(@__condition_1, [d].[DeptCode]) > 0)

DECLARE @__condition_1 nvarchar(4000) = N'H33';
DECLARE @__condition_1_1 varchar(5) = 'H33';
WHERE  (@__condition_1 = N'' OR LEFT([d].[DeptCode], LEN(@__condition_1_1)) = @__condition_1_1)

DECLARE @__condition_1 nvarchar(4000) = N'H33';
DECLARE @__condition_1_1 nvarchar(20) = N'H33';
WHERE (@__condition_1 = N'' OR RIGHT([d].[DeptName], LEN(@__condition_1_1)) = @__condition_1_1)

 注意:使用固定字符串 EF LINQ 语法转换SQL 时,Contains、StartsWith、EndsWith都转换成了LIKE ;但是使用字符串变量时,Contains、StartsWith、EndsWith分别转换成了 CHARINDEX、LEFT、RIGHT