实体框架EF.Functions.Like vs string.Contains
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了实体框架EF.Functions.Like vs string.Contains相关的知识,希望对你有一定的参考价值。
我正在阅读实体框架核心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.Like
和string.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")
)
这是什么原因?
像查询一样支持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查询的答案)
@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提供商可能会以不同方式对其进
以上是关于实体框架EF.Functions.Like vs string.Contains的主要内容,如果未能解决你的问题,请参考以下文章
Linq WHERE EF.Functions.Like - 为啥直接属性起作用而反射不起作用?