【发布时间】:2018-01-24 07:27:34
【问题描述】:
我正在阅读实体框架核心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"))
是这个原因吗?
【问题讨论】:
-
检查 SQL 语句。最有可能的是,它们是相同的。
.StartsWith被翻译成LIKE 'a%'。另一方面,包含 将被转换为LIKE '%a%',这是一个非常糟糕的主意。LIKE 'a%'可以利用索引,因为它本质上是一个范围搜索。LIKE '%a%'虽然必须处理所有行以查找模式是否匹配 -
是的,就是这个原因
-
是的,正如我所怀疑的那样,如果他们为它提供一个扩展方法会好很多,c.Name.Like(...)
-
如果您没有为“like”提供字符大小写,它只会搜索您提供的字符或单词。也包含做同样的事情。但为了避免字符大小写,你可以使用如下: string k = "I like your style"; StringComparison stringComparison = StringComparison.CurrentCultureIgnoreCase; Console.WriteLine(k.IndexOf("your", stringComparison));
-
只是灵活性更高。阅读
.Like('abc%def%ghi')会更容易,然后尝试使用不同的树方法编写相同的内容。
标签: c# entity-framework .net-core entity-framework-core