2009-06-10 18 views
20

İşte sorguLINQ to SQL ve Null dizeleri, nasıl kullanılır?

from a in this._addresses 
where a.Street.Contains(street) || a.StreetAdditional.Contains(streetAdditional) 
select a).ToList<Address>() 

eğer olduğunu her iki özelliği de fıkra bu güzel değerleri çalışır, ama örneğin a.StreetAdditional (Çoğu kez) boşsa, bir null başvuru özel alacak nereye .

Bunun etrafında bir iş var mı?

sayesinde

+0

Bir istisna aldın mı? Yoksa istisnadan daha spekülasyon yapıyor musunuz? –

+0

İstisnalarım var. – Oakcool

+0

Bunun için bir "NullReferenceException" varsa, SQL sorgusuna bir LINQ yapmıyorsunuz. –

cevap

37

en belirgin tek: O hatasız boş argüman kabul İçeren için

from a in this._addresses 
where (a.Street != null && a.Street.Contains(street)) || (a.StreetAdditional != null && a.StreetAdditional.Contains(streetAdditional)) 
select a).ToList<Address>() 

Alternatif bir uzantısı yöntem yazabilirsiniz. Bazıları böyle bir yönteme sahip olmanın o kadar da güzel olmadığını söyleyebilir, çünkü normal bir yöntem çağrısı gibi görünür, ancak boş değerler için izin verilir (bu nedenle normal sıfırlama uygulamalarını bir kenara bırakır). null denetimi false ise

+0

görünüyor. – Oakcool

+4

Özel uzatma yöntemleri LINQ SQL için kullanılabilir değildir Teşekkür çalışmak gibi –

1

Kontrol özellikleri

from a in this._addresses 
where (a.Street != null && a.Street.Contains(street)) || 
(a.StreetAdditional != null && a.StreetAdditional.Contains(streetAdditional)) 
select a).ToList<Address>() 

boş olmadığından emin olmak için, daha sonra & & sonra ikinci fıkra değerlendirmek olmaz. StreetAdditionalnull ise

1
from a in this._addresses 
where a.Street.Contains(street) || (a.StreetAdditional != null && a.StreetAdditional.Contains(streetAdditional) 
select a).ToList<Address>() 
3

Önce işaretlemelisiniz.

&& bir kısayol-operatör olduğu için bu işleri

where a.Street.Contains(street) || ((a != null) && a.StreetAdditional.Contains(streetAdditional)) 

Deneyin ve a != null yanlış verir eğer sonuç yine false olacağından, null ile ikinci ifadesi-değeri değerlendirmeye alınmayacaktır.

4

Boş bir diziyi boşsa döndürmek için bir uzantı yöntemi oluşturur ve çağrısı yöntemi içerir.

public static IEnumerable<T> EmptyIfNull<T>(this IEnumerable<T> pSeq) 
{ 
     return pSeq ?? Enumerable.Empty<T>(); 
} 

from a in this._addresses 
where a.Street.Contains(street) || 
     a.StreetAdditional.EmptyIfNull().Contains(streetAdditional) 
select a).ToList<Address>() 
+0

Biraz garip görünüyor çünkü bir 'null' nesneleri üye işlevlerini çağırıyor gibi görünüyor. – Dario

+0

Kullanmak için daha fazla? Şebeke. Ben de aynısını önerdim. Uzantı yönteminin sorguyu garip görmesini sağladığınızı düşünüyorsanız, uzantı yöntemi olmadan yapabilirsiniz. –

42

Ben null coalescing operatörü kullanmayı tercih ediyorum ...

(from a in this._addresses 
where (a.Street ?? "").Contains(street) || (a.StreetAdditional ?? "").Contains(streetAdditional) 
select a).ToList<Address>() 
+4

Bu daha temiz bir yaklaşımdır. IQueryable ile çalışırken mükemmel – DanKodi

2

Ben SqlServer size boş bir istisna verdi sanmıyorum. Eğer yaptıysa, bu kod açıkça LinqToSql (soruyu etiketlediğiniz gibi) çalıştırmıyor.

string.Contains, sıfır değerlerle hiç sorun yaşamayan sql's like'a çevrilecektir.

1

Sokak ve streetAdditional değişkenlerinin boş olmadığından emin olmak için kontrol etmek isteyebilirsiniz. Ben sadece aynı problemin karşısında koştum ve problemimi çözmek için boş bir dizeye koymalarını istedim.

street = street ?? ""; 
streetAdditional = streetAdditional ?? ""; 
from a in this._addresses 
where a.Street.Contains(street) || a.StreetAdditional.Contains(streetAdditional) 
select a).ToList<Address>() 
-1

Dikkat edilmesi gereken tek şey, önce boş değerlerin değerlendirilmesidir.

where (**a.Street != null** && a.Street.Contains(street)) || (a.StreetAdditional != null && a.StreetAdditional.Contains(streetAdditional)) 
select a).ToList<Address> 

()