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

are*_*ler 39 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
Run Code Online (Sandbox Code Playgroud)

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

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

这是什么原因?

Tse*_*eng 40

@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提供商可能会以不同方式对其进

  • 哪一个更快? (17认同)
  • @revobtz:不确定您是否意识到了这一点,这不是关于 C# 字符串操作,而是关于 SQL(以及使用这些操作的 Entity Framework Core 表达式如何转换为 SQL) (5认同)

adi*_*iga 35

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

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

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

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

  • 另外考虑阅读[#474查询:改进String的StartsWith,EndsWith和Contains的翻译](https://github.com/aspnet/EntityFramework/issues/474)线程,除了这个决定背后的灵活性原因. (2认同)