2017-08-16 65 views
8

vs ben Onlar SQL LIKE işlemi gerçekleştirmek için EF.Functions.Like gibi yeni SQL fonksiyonları eklendi söylüyor taraf çerçeve çekirdeğinin 2,0 https://blogs.msdn.microsoft.com/dotnet/2017/08/14/announcing-entity-framework-core-2-0/Varlık çerçeve EF.Functions.Like string.Contains

duyurusunu okuyordu.

Merak ediyorum, o zaman EF.Functions.Like ve string.Contains/StartsWith arasındaki fark nedir?

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 

Ne iki sürüm arasındaki fark olacaktır: Örneğin

? EF, string.Contains/StartsWith'un ilgili SQL işlemlerine nasıl dönüştürüleceğini çoktan biliyor, değil mi? i düşünebilirsiniz

tek nedeni (bu bir StartsWith("a") && Contains("b") olarak yazılabilir rağmen) EF.Functions.Like

bu nedenle mi "a%b%" gibi daha karmaşık modeller için izin vereceğini mi?

+3

SQL deyimini kontrol edin. Büyük ihtimalle aynıdırlar. '.İşlemlerİşin '%'' '' LIKE'ya çevrilir. * İçerir * diğer tarafa 'LIKE 'a%' a dönüştürülür, bu da çok kötü bir fikir. '' LIKE 'a%' 'indekslerden faydalanabilir, çünkü esas olarak bir aralık araştırmasıdır. 'LIKE'% a% '', eğer desen –

+1

modelinin eşleşip eşleşmediğini bulmak için tüm satırları işlemek zorundadır Evet, –

+0

Evet, neden şüpheleniyordum, bunun için bir uzantı yöntemi sağladılarsa çok daha iyi olurdu o, c.Name.Like (...) – areller

cevap

10

Sorgulama, wildcard characters desteğini destekler ve bu nedenle bazı senaryolarda dize uzantısı yöntemleriyle karşılaştırıldığında çok kullanışlıdır. Örneğin için

:

var customers = from c in context.Customers 
        where EF.Functions.Like(c.City, "[aeiou]%"); 
        select c; 
: Biz aramak için olsaydı bütün 4 sesli harf ile başlar biz EF.Functions.Like(c.Name, "_ri_");

yapabileceğini veya şehirlerden tüm müşterileri almak için orta karakterler olarak 'ri' isimleri lettered

+0

Tamam StartsWith/Containts fonksiyonları ile bir sorun vardı, bu mantıklı. Ayrıntılı yanıt için teşekkür ederiz. – areller

+2

Ayrıca, bu kararın arkasındaki esneklik nedenlerinden ötürü [# 474 Sorgu: Dizenin Başlangıcı, İşlevi ve İçeriklerini Çevirinin Geliştirilmesi] (https://github.com/aspnet/EntityFramework/issues/474) adlı makaleyi okumanızı da düşünebilirsiniz. –

9

@adiga'nın cevabı oldukça eksiktir ve kullanımdaki farklılıkların sadece bir kısmını kapsamaktadır. Ayrıca, .StartsWith(...), .Contains(...) ve .EndsWith(...) da, EF.Functions.Like numaralı SQL'e farklı bir şekilde çevrilmişlerdir. Ayrıca, EF.Functions.Like. Örneğin, .StartsWith, 'un 'a çevrildiği (string LIKE pattern + "%" AND CHARINDEX(pattern, string) = 1) OR pattern = '' olarak çevrilir. Ancak, string LIKE pattern [ESCAPE escapeChar] numaralı telefona string LIKE pattern [ESCAPE escapeChar] numaralı telefona çevrilir.

Bu, Performans üzerinde de etkileri olabilir. Yukarıdaki EF Çekirdek SqlServer sağlayıcısı için geçerlidir. Diğer EF Çekirdek sağlayıcıları bunu farklı şekilde çevirebilir.