Harmanlamalar ve büyük küçük harf duyarlılığı
Not
Bu özellik EF Core 5,0 ' de tanıtılmıştı.
Veritabanlarında metin işleme karmaşık olabilir ve bir kereden fazla Kullanıcı ilgilenmesini gerektirir. Tek bir şey için veritabanları, metnin nasıl ele alınacağını önemli ölçüde farklılık gösterir. örneğin, bazı veritabanları varsayılan olarak büyük/küçük harfe duyarlıdır (örn. Sqlite, postgresql), diğerleri büyük/küçük harfe duyarsızdır (SQL Server, MySQL). Ayrıca, dizin kullanımı, büyük/küçük harf duyarlılığı ve benzer yönler, sorgu performansı üzerinde string.ToLower büyük/küçük harfe duyarsız bir karşılaştırmayı zorlamak için kullanılması mümkün olsa da, büyük/küçük harfe duyarlı bir veritabanında büyük/küçük harfe duyarsız bir karşılaştırmaya zorlamak için kullanılması mümkün olsa da uygulamanızın dizinleri kullanmasını engelleyebilir. Bu sayfada büyük/küçük harf duyarlılığı veya daha genel, harmanlamalar yapılandırma ve sorgu performansından ödün vermeden etkili bir şekilde nasıl yapılacağı hakkında bilgi sağlanır.
Harmanlamalara giriş
Metin işlemede temel bir kavram harmanlama, metin değerlerinin nasıl sıralandığına ve eşitlik için nasıl karşılaştırıldığını belirleyen bir kurallar kümesidir. Örneğin, büyük/küçük harfe duyarsız bir harmanlama, eşitlik karşılaştırması amacıyla büyük ve küçük harfler arasındaki farkları kabul etmez, büyük/küçük harfe duyarlı harmanlama değildir. Ancak, büyük/küçük harf duyarlılığı kültüre duyarlı olduğundan (örneğin, iI Türkçe 'de farklı bir harf temsil ettiğinden), her biri kendi kural kümesine sahip birden fazla büyük küçük harfe duyarsız harmanlama mevcuttur. Harmanlamalar kapsamı, büyük/küçük harf duyarlılığı yerine karakter verilerinin diğer yönlerini de uzatır; Almanya 'da Örneğin, bazen (her zaman değil), ä aynı şekilde ve aynı şekilde ele alınır ae . Son olarak, harmanlamalar metin değerlerinin sıralanmabiçimini de tanımlar: Almanca sonra a , İsveç, alfabeden sonuna yer koyar.
Bir veritabanındaki tüm metin işlemleri, işlemin nasıl Karşılaştırıldığı ve sıraladığı, açıkça veya örtük olarak yapılıp yapılmayacağını belirleme şeklinde harmanlama kullanır. Kullanılabilir harmanlamalar ve adlandırma düzenlerinin gerçek listesi veritabanına özgüdür; çeşitli veritabanlarının ilgili belge sayfalarının bağlantıları için aşağıdaki bölüme bakın. Neyse ki veritabanı genellikle veritabanı veya sütun düzeyinde bir varsayılan harmanlamanın tanımlanmasına ve bir sorgudaki belirli işlemler için hangi harmanlamanın kullanılması gerektiğini açıkça belirtmektir.
Veritabanı harmanlaması
Çoğu veritabanı sisteminde, veritabanı düzeyinde varsayılan harmanlama tanımlanır; geçersiz kılınmadığı takdirde, harmanlama bu veritabanı içinde oluşan tüm metin işlemlerine örtük olarak uygulanır. Veritabanı harmanlaması genellikle veritabanı oluşturma zamanında ( CREATE DATABASE DDL ekstresi aracılığıyla) ayarlanır ve belirtilmemişse, varsayılan olarak kurulum zamanında belirlenen bir sunucu düzeyi değeri alır. örneğin, SQL Server ' deki varsayılan sunucu düzeyi harmanlama, SQL_Latin1_General_CP1_CI_AS büyük/küçük harfe duyarsız, aksan duyarlı harmanlama olan. Veritabanı sistemleri genellikle var olan bir veritabanının harmanlanmasını değiştirmeye izin verse de, bunun yapılması karmaşıklıklara yol açabilir; veritabanı oluşturmadan önce bir harmanlama seçmeniz önerilir.
veritabanı şemanızı yönetmek için EF Core geçişleri kullanırken, modelinizin yönteminde aşağıdakiler, OnModelCreating büyük/küçük harfe duyarlı harmanlama kullanmak için bir SQL Server veritabanı yapılandırır:
modelBuilder.UseCollation("SQL_Latin1_General_CP1_CS_AS");
Sütun harmanlama
Harmanlamalar Ayrıca, metin sütunlarında tanımlanabilir ve veritabanı varsayılanını geçersiz kılar. Bu, belirli sütunların büyük/küçük harfe duyarsız olması gerekiyorsa yararlı olabilir, ancak veritabanının geri kalanı büyük/küçük harfe duyarlı olmalıdır.
Veritabanı şemanızı yönetmek için EF Core geçişleri kullanırken aşağıdaki, özelliği için sütunu, Name Aksi durumda büyük/küçük harfe duyarlı olacak şekilde yapılandırılmış bir veritabanında büyük küçük harfe duyarsız olacak şekilde yapılandırır:
modelBuilder.Entity<Customer>().Property(c => c.Name)
.UseCollation("SQL_Latin1_General_CP1_CI_AS");
Sorguda açık harmanlama
Bazı durumlarda, aynı sütunun farklı sorgular tarafından Farklı harmanlamalar kullanılarak sorgulanması gerekir. Örneğin, bir sorgunun bir sütunda büyük/küçük harfe duyarlı bir karşılaştırma gerçekleştirmesi gerekebilir, diğer bir deyişle, aynı sütunda büyük/küçük harf duyarsız bir karşılaştırma gerçekleştirmeniz gerekebilir. Bu, açıkça sorgunun kendisi içinde harmanlama belirtilerek gerçekleştirilebilir:
var customers = context.Customers
.Where(c => EF.Functions.Collate(c.Name, "SQL_Latin1_General_CP1_CS_AS") == "John")
.ToList();
bu, COLLATE sütun veya veritabanı düzeyinde tanımlanan harmanlamayı ne olursa olsun, büyük/küçük harfe duyarlı harmanlama uygulayan SQL sorgusunda bir yan tümce oluşturur:
SELECT [c].[Id], [c].[Name]
FROM [Customers] AS [c]
WHERE [c].[Name] COLLATE SQL_Latin1_General_CP1_CS_AS = N'John'
Açık harmanlamalar ve dizinler
Dizinler, veritabanı performansındaki en önemli faktörlerden biridir. bir dizinle etkin şekilde çalışan bir sorgu, bu dizin olmadan bir durdurmak için korunmamıza olabilir. Dizinler, kendi sütun harmanlamalarını örtülü olarak miras alır; Bu, sütundaki tüm sorguların otomatik olarak söz konusu sütunda tanımlanan dizinleri kullanmasına uygun olduğu anlamına gelir. sorgu farklı bir harmanlama belirtmediği belirtildi. Bir sorguda açık harmanlama belirtmek genellikle bu sorgunun bu sütunda tanımlı bir dizin kullanmasını engeller; çünkü harmanlamalar artık eşleşmeyecektir; Bu nedenle, bu özelliği kullanırken dikkatli olmanız önerilir. Her zaman, sütun (veya veritabanı) düzeyinde harmanlama tanımlamak tercih edilir. Bu, tüm sorguların örtülü olarak bu harmanlamayı ve herhangi bir dizinden faydalanmasını sağlar.
Bazı veritabanlarının bir dizin oluştururken harmanlama tanımlandığına (ör. PostgreSQL, SQLite) izin verdiğine unutmayın. Bu, birden çok dizinin aynı sütunda tanımlanmasını sağlar, farklı harmanlamalarla işlemleri hızlandırın (ör. büyük/küçük harfe duyarlı ve büyük/küçük harfe duyarsız karşılaştırmalar). Daha fazla bilgi için veritabanı sağlayıcınızın belgelerine başvurun.
Uyarı
Sorgularınızın sorgu planlarını her zaman inceleyin ve büyük miktarlarda veri üzerinde yürütülen performans açısından kritik sorgularda uygun dizinlerin kullanıldığından emin olun. Bir sorgudaki (veya çağırarak) büyük/küçük harf duyarlılığını geçersiz kılmak EF.Functions.Collatestring.ToLower uygulamanızın performansına çok önemli bir etkiye sahip olabilir.
Yerleşik .NET dize işlemlerinin çevirisi
.NET ' te dize eşitlik, varsayılan olarak büyük/küçük harfe duyarlıdır: s1 == s2 dizelerin özdeş olmasını gerektiren sıralı bir karşılaştırma gerçekleştirir. veritabanlarının varsayılan harmanlaması değiştiğinden ve basit eşitlik 'in dizin kullanması isteneceği için EF Core, basit eşitliği bir veritabanı küçük harfe duyarlı bir işleme çevirmeye yönelik değildir. C# eşitlik, kullanımda olan belirli veritabanına ve harmanlama yapılandırmasına bağlı olarak, büyük/küçük harfe duyarlı olmayan bir SQL eşitlik için doğrudan çevrilir.
Ayrıca, .NET, string.EqualsStringComparison karşılaştırma için büyük/küçük harf duyarlılığı ve kültür belirtilmesine izin veren bir sabit listesi kabul eden aşırı yüklemeler sağlar. tasarım yaparak, bu aşırı yüklemeleri SQL olarak çevirdiğinizden EF Core, ancak bunları kullanmaya çalışmak özel bir durumla sonuçlanır. Tek bir şey için EF Core, büyük/küçük harf duyarlı veya büyük/küçük harfe duyarsız harmanlama kullanılması gerektiğini bilmez. Daha önemlisi, harmanlama uygulamak çoğu durumda dizin kullanımını engeller ve çok temel ve yaygın olarak kullanılan .NET yapısına yönelik performansı önemli ölçüde etkiler. Bir sorguyu büyük küçük harfe duyarlı veya büyük/küçük harfe duyarsız karşılaştırma kullanacak şekilde zorlamak için, EF.Functions.CollateEF.Functions.Collateaçıklandığı gibi bir harmanlamayı açıkça belirtin.
Ek kaynaklar
Veritabanına özgü bilgiler
- harmanlamalar üzerinde SQL Server.
- Harmanlamalar üzerinde Microsoft. Data. SQLite belgeleri.
- Harmanlamalar üzerinde PostgreSQL belgeleri.
- Harmanlamalar üzerinde MySQL belgeleri.
Diğer kaynaklar
- EF Core Community sessiz oturum, harmanlamalar ve performans ve dizin oluşturma yönlerini keşfetme.