2012-06-14 25 views
6

我做的左连接LINQ到SQL,所以我的问题是,当选择正确的表字段,我检查每个字段wheather连接的对象是否为空,这是正确的方法吗?或者还有其他方法可以做到吗?我的查询是像LINQ到SQL的左连接,需要检查为空表为

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 ? 
} 

正确造成的答案查询,但如果我不检查空 其扔object reference not set.....error那几个领域。 这是什么DefaultIfEmpty()干什么?

回答

3

你所做的是正确的。

msdn,DefaultIfEmpty返回:

一个IEnumerable <Ť>对象包含用于如果源是空的 TSource类型的默认值;否则,来源。

换句话说,当集合为空时,它将返回T的默认值。引用类型的默认值为空 - 这就是您选择DeptName时必须检查null的原因。

+0

谢谢,实际上我有一个相当大数量的字段,每个字段都必须检查null im感觉有点肮脏的编程,所以认为有没有其他的方式来做到这一点.. – Meson

0

在这种情况下,DefaultIfEmpty为您提供了虚拟左侧的空对象。因此,试图调用ujoinx.employeeSal将返回对象引用no set,因为ujoinx为null。