2017-08-16 133 views
8

我讀實體框架的核心2.0 https://blogs.msdn.microsoft.com/dotnet/2017/08/14/announcing-entity-framework-core-2-0/實體框架EF.Functions.Like VS string.Contains

宣佈它說,他們增加了新的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")

這是什麼原因?

+3

檢查SQL語句。最有可能的是,它們是相同的。 '.StartsWith'被轉換爲'LIKE'a%''。 *包含*另一方面將被轉換爲'LIKE'%a%'',這是一個非常糟糕的主意。 'LIKE'%''可以利用索引,因爲它本質上是一個範圍搜索。 'LIKE'%a%''雖然必須處理所有行以查找模式是否匹配 –

+1

是的,多數民衆贊成在 –

+0

是的,這是我懷疑,它會更好,如果他們提供了一個擴展方法它,c.Name.Like(...) – areller

回答

10

與查詢支持wildcard characters一樣,因此與某些場景中的字符串擴展方法相比非常有用。

對於例如:如果我們搜索所有4個字母與「裏」的名字作爲中間人物,我們可以做EF.Functions.Like(c.Name, "_ri_");

,或者從城市讓所有的客戶與元音開始:

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

上遇到了StartsWith/Containts函數的問題好吧,這很有道理。 謝謝你的詳細答案。 – areller

+2

另外考慮閱讀[#474查詢:改善字符串的StartsWith,EndsWith和Contains的翻譯](https://github.com/aspnet/EntityFramework/issues/474)線程的靈活性原因不在此決定背後。 –

9

@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提供商可能會對其進行不同的翻譯