linq to sql left join,需要为右表检查null

时间:2012-06-14 12:05:41

标签: c# linq linq-to-sql

我要继续加入linq to 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 ?
}

查询得到的答案是正确的,但如果我不检查这几个字段为null 它投掷object reference not set.....error。 这里DefaultIfEmpty()到底是什么?

2 个答案:

答案 0 :(得分:3)

你所做的是正确的。

msdn开始,DefaultIfEmpty返回:

  

IEnumerable< T>包含默认值的对象   如果source为空,则为TSource类型;否则,来源。

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

答案 1 :(得分:0)

在这种情况下,DefaultIfEmpty会在evaulation的左侧为您提供一个空对象。因此,尝试调用ujoinx.employeeSal将返回对象引用no set,因为ujoinx为null。