2012-06-14 14 views
6

i 'in soldaki sql'de linq'e katılmam, bu yüzden sorum doğru tablo alanlarını seçerken, her alanın kontrolünü birleştiriyorum. boş ya da değil, bu doğru yol mu? ya da bunu yapmak için başka bir yolu var mı? Benim sorgulinq to sql left join, doğru tablo için null olup olmadığını kontrol etmek gerekiyor

from u in user 
join x in employeee on u.id equals x.userId 
     into ux from ujoinx in ux.DefaultIfEmpty() 
join y in department on x.id equals y.employeeId 
     into xy from xjoiny in xy.DefaultIfEmpty() 
select new { 
    EmployeeSal = ujoinx!=null?ujoinx.employeeSal:0, // see checkig for null 
    EmployeeTax = ujoinx!=null?ujoinx.employeeTax:0, // in this 3 lines 
    UserName = u.username, 
    DeptName = xjoiny!=null?xjoiny.name:""   //is this a correct way ? 
} 

gibi düzgün cevap çıkan sorgusudur ama boş onun object reference not set.....error atma için o birkaç alanları kontrol yoksa. İşte tam olarak ne DefaultIfEmpty() doin nedir?

cevap

3

Yaptığınız şey doğru. msdn kaynaktan

, DefaultIfEmpty verir:

IEnumerable < T kaynak boşsa TSource türü için varsayılan bir değer içerir > nesne; aksi halde, kaynak. Eğer DeptName seçtiğinizde boş olup olmadığını kontrol gerekir bu yüzden - koleksiyon boş olduğunda başka deyişle

, bu referans türleri için varsayılan değer null T. için varsayılan değeri dönecektir.

+0

Teşekkür ederim, aslında çok sayıda alanım var, her alan için boş bir programa sahip olduğumu kontrol etmeliyim, bu yüzden bunu yapmak için başka bir yol var mı diye düşünün .. – Meson

0

DefaultIfEmpty bu durumda, alüvyonun sol tarafında boş bir nesne verir. Bu nedenle ujoinx null olduğu için ujoinx.employeeSal çağrılmaya çalışılır.

İlgili konular