实体框架 EF.函数.喜欢 vs 字符串.包含



我正在阅读实体框架核心 2.0 的公告 https://blogs.msdn.microsoft.com/dotnet/2017/08/14/announcing-entity-framework-core-2-0/

它说他们添加了新的SQL函数,如EF.Functions.Like来执行SQLLIKE操作。

我想知道,那么EF.Functions.Likestring.Contains/StartsWith之间有什么区别?

例如:

var customers = context.Customers.Where(c => c.Name.StartsWith("a")); // Version A
var customers = context.Customers.Where(c => EF.Functions.Like(c.Name, "a%")); // Version B

两个版本之间有什么区别? EF 已经知道如何将string.Contains/StartsWith转换为相应的 SQL 操作,不是吗?

我能想到的唯一原因是EF。Functions.Like 将允许更复杂的模式,如"a%b%"(尽管这个可以写成StartsWith("a") && Contains("b")(

这是原因吗?

Like 查询支持通配符,因此在某些情况下与字符串扩展方法相比非常有用。

例如:如果我们要搜索所有以"ri"作为中间字符的 4 个字母名称,我们可以EF.Functions.Like(c.Name, "_ri_");

或者从以元音开头的城市获得所有客户:

var customers = from c in context.Customers 
where EF.Functions.Like(c.City, "[aeiou]%")
select c;

(请阅读@Tseng的回答,了解它们如何以不同的方式转换为SQL查询(

@adiga的答案非常不完整,只涵盖了部分用法差异。

但是,.StartsWith(...).Contains(...).EndsWith(...)也以不同的方式转换为SQL而不是EF.Functions.Like

例如,.StartsWith被翻译为(string LIKE pattern + "%" AND CHARINDEX(pattern, string) = 1) OR pattern = ''.Contains被翻译成(CHARINDEX(pattern, string) > 0) OR pattern = ''

然而,EF.Functions.Like被翻译成string LIKE pattern [ESCAPE escapeChar].

这也可能对性能产生影响。以上内容对 EF CoreSqlServer提供程序有效。其他 EF Core 提供程序可能会以不同的方式进行转换。

最新更新