2009-12-05 22 views
5

Linq to Sql string karşılaştırmalarıyla ilgili çelişkili açıklamalar okuyorum.Linq to Sql büyük/küçük harf duyarsız eşitlik

aşağıdaki yaptığınızda:

from p in db.People 
    where p.UserName=username 
    select p 

kullanıcı adı = "John"

Doğru harf duyarsız bir sonuç almak. Linq bunu varsayılan olarak mı yapıyor yoksa bu SQL veritabanında mı oluyor?

+0

Bazı alıntılar eksik mi? Değişken isimlerinin durumunu değiştirmek sonuçları etkilemez. –

+0

bu anlama gelmediğimi anlamadım – zsharp

cevap

4

Sanırım db değişkeninizin neye işaret ettiği ve karşılaştırmanın gerçekte yürütüldüğü yere dayalı olarak çelişen sonuçlar elde ediyorsunuz. Eğer yapabilirse, linq sorguyu oluşturacak ve SQL sunucusuna gönderecektir.

seçme [t0] .col1, [t0] .col2, ..., [: Eğer kabaca böyle bir şey çevirmek olacaktır

where p.UserName.ToLower()=username.ToLower() 
+1

Üzgünüz, ama bu kötü bir tavsiye. p.UserName.ToLower() = username.ToLower(), tam bir tablo taramasını zorlayacak bir SQL sorgusuna dönüştürecektir. "İnsan" tablosunun küçük olması fark etmez, ancak büyük bir tablo ise, 'kullanıcı adı' sütununu kapsayabilecek herhangi bir endeksi kullanamaz. – KristoferA

1

Veritabanına bağlıdır. SQL Server 2008, dizeleri bir dizin ifadesinde kullanıldığında da dahil olmak üzere büyük/küçük harfe duyarlı olarak ele alır. Linq bunu yapmaz.

on MSDN veya this article'u okuyun.

+2

Durum duyarlılığı/duyarsızlığı, veritabanınızda ve/veya ilgili sütunlarda kullandığınız harmanlamaya bağlıdır (sql sunucusu kurulduğunda varsayılan ayarlanmıştır, ancak birkaç yerde geçersiz kılınabilir) sütun seviyesi). – KristoferA

3

Sizin örnek sorgu arayarak duyarsız durumda zorlayacağını gibi görünüyor [şema] den .coln t0]. [İnsanlar] [t0] .UserName = @ p0

... kullanıcı adı değişkeninde değer @ p0 sql değişkeninde geçilecek . Bu durumda, büyük/küçük harf duyarlılığı, vurgulama duyarlılığı vb. Kullanmak için SQL Server örneğinizi/db/table/sütununuzu ayarladığınız harmanlama tarafından kontrol edilir. Başka bir yerde belirtilmemişse, DB'ler veya DB örneğinin varsayılan harmanlaması kullanılır, ancak harmanlama sütun seviyesine kadar tam olarak belirtilebilir.

Çoğu insan vaka duyarsız (CI) alfabe ile SQL Server çalıştırmak ancak yukarıda söylediğimiz gibi sadece orada var harmanlamadan kontrol etmek gerekiyor bu yüzden, bu DB geçersiz kılınabilir.

Bu, L2O (nesneler için linq) sorgusuyla aynı şeyi yaparsanız, bunun tersi durumda, büyük/küçük harf duyarlılığı varsayılan değerdir ve siz bunu string.equals geçersiz kılma özelliğini kullanarak büyük/küçük harf duyarlı hale getirmeniz gerekir. Bu, kültür ve/veya büyük/küçük harf duyarsızlığı belirtmenize izin verir ...

+0

Bir string.equals geçersiz kılma kullanmam benim sonucuyla aynı yorumda bulundu mu? Karşılaştırmayı yapmak için tüm kayıtları linq tarafına gelmeye zorlayın. –

+0

@Jeff, String.equals referansı, L2S ve L2O'nun nasıl davrandığının bir karşılaştırmasıydı, bu noktada net olmasaydım özür dilerim. Ama evet, ikisini birleştirirseniz ve değerlendirmeyi müşteri tarafında bir L2O sorgusu olarak yaparsanız, o zaman sadece tüm kayıtları almakla kalmaz, aynı zamanda tel üzerinden de gönderirsiniz. Diğer bir deyişle, doğru harmanlamayı kullanmak burada anahtardır. Cevabınızdaki örnek yine de veritabanında değerlendirilecek, ancak tablonun yazdığı sol taraftaki işlev çağrısı sarmalayıcı nedeniyle bir tablo taramasının ek yükünün eklenmesiyle. – KristoferA

+0

Yanıt için teşekkürler (önceki yorumu yaptığımda +1 verdim) –