EF Core 模糊查询的三种方式

通常我们在EF常用的模糊查询方式是Contains,使用也非常的方便,还有StartsWith和EndWith,组合起来都能满足模糊查询的需求,其实EF Core 2.0出现了模糊查询的新方法,那就是EF.Functions.Like。本文通过实列来看三者查询的使用和区别。我们使用EF Core 6来测试。

1、Contains

先来看看Contains,它的使用方法很简单,看看使用语法。.

var rel= teamRepository.GetTeams().Where(w => w.Name.Contains("aaa"))

然后用SQL Server Profiler工具查看执行的SQL语句:

SELECT [t].[Id], [t].[Name] FROM [Teams] AS [t] WHERE [t].[Name] LIKE N'%aaa%'

EF Core现在相当漂亮,已经无限接近原生SQL了。

2、StartsWith和EndWith

StartsWith和EndWith相当于Like '*%'和Like '%*' 查询语法如下:

var rel = teamRepository.GetTeams().Where(w => w.Name.StartsWith("aaa")).ToList();var rel2 = teamRepository.GetTeams().Where(w => w.Name.StartsWith("aaa")).ToList();

用SQL Server Profiler工具查看执行的SQL语句:

SELECT [t].[Id], [t].[Name]FROM [Teams] AS [t]WHERE ([t].[Name] IS NOT NULL) AND ([t].[Name] LIKE N'aaa%')SELECT [t].[Id], [t].[Name]FROM [Teams] AS [t]WHERE ([t].[Name] IS NOT NULL) AND ([t].[Name] LIKE N'%aaa')

StartsWith和EndWith多了([t].[Name] IS NOT NULL),为啥呢?其实当Name可以为空的情况下才会加上Is NOT NULL。现在EF Core 已经优化得很棒了。

3.EF.Functions.Like

EF.Functions.Like可以像原生like一样直接写语句,使用EF.Functions.Like需要using Microsoft.EntityFrameworkCore。使用如下:

teamRepository.GetTeams().Where(w =>EF.Functions.Like(w.Name,"%aaa%")).ToList();

用SQL Server Profiler工具查看执行的SQL语句:

SELECT [t].[Id], [t].[Name] FROM [Teams] AS [t] WHERE [t].[Name] LIKE N'%aaa%'

如果用"%aaa%"写法,那么跟Contains一致,如果是“aaa%"的写法不会有is not null的语句,这翻译过来不就是原生的语句吗?。EF.Functions.Like的好处是可以自定义表达式,比如使用通配符等,唯一不好的是需要引用EF类库才能用。

结语

    本文通过SQL Server Profiler对比了EF Core模糊查询的三种方式生成的语句,非常的漂亮,说明EF Core 6已经非常接近原生SQL了,对于性能问题大家可以放心地用了。在EF Core 6之前的版本中StartsWith、Contains和EndsWith模糊查询分别被解析成为Left、CharIndex和Right,而不是Like,EF Core 6全变成Like了,很不错。

    希望本文对你有收获,同时你对EF CORE模糊查询有啥看法,欢迎留言讨论。