实体框架EF.Functions.Like vs string.Contains

时间:2017-08-16 08:31:29

标签: c# entity-framework

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

的公告

它表示他们添加了新的Sql函数,如EF.Functions.Like,用于执行SQL LIKE操作。

我想知道,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")

这是原因吗?

2 个答案:

答案 0 :(得分:31)

@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 Core SqlServer 提供程序。其他EF Core提供商可能会以不同方式对其进

答案 1 :(得分:25)

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

例如:如果我们用' 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查询的答案)

相关问题