如何在linq中为两个不相等的列表留下外连接

时间:2017-04-03 12:50:40

标签: c# linq left-join

我的意思是两个不平等的名单:

列表1:

LeaveType  Openning
---------  --------
Casual        25
Annual        30
Medical       23

列表2:

LeaveType  Availed
---------  -------
Casual       3
Annual       5

请注意,上面的两个列表的行数不等,我尝试将上述两个列表组合在一个相同的列中,即LeaveType左边加入两个列表,得到如下结果:

输出列表:

LeaveType  Openning  Availed
---------  --------  -------
Casual        25        3
Annual        30        5
Medical       23        0

到目前为止,我所尝试的是以下linq查询:

(from o in LIST1
  join a in LIST2
  on o.LeaveType equals a.Leave_Type
  into temp
  from a in temp.DefaultIfEmpty()
  select new
  {
     LeaveType = o.LeaveType,
     Openning = o.Openning,
     Availed = a.Availed == 0 ? 0 : a.Availed,         
  }).ToList();

上面的查询适用于创建输出列表的前两行,但是当它涉及创建第三行时,它会抛出NullReferenceException,即使我将检查设为a.Availed == 0 ? 0 : a.Availed返回零,a.Availed的类型为decimal,但仍然会抛出NullReferenceException,为什么?以及如何摆脱这个?谢谢:))

修改

NullReferenceException只是为了证据:

enter image description here

1 个答案:

答案 0 :(得分:2)

每次要访问该项的属性时,都需要检查'a'是否为null,因为如果它是空的,它将为null(默认情况下)。换句话说,当您调用DefaultIfEmpty()时,您正在执行相对于第一个列表的左连接(在您的情况下为LIST1)。这意味着如果与您的连接匹配子句不匹配,则'a'将为null(在您的情况下,o.LeaveType等于a.LeaveType)。

select new
{
    LeaveType = o.LeaveType,
    Openning = o.Openning,
    Availed = a == null ? 0 : a.Availed, //check if a is null  
    Balance = o.Openning - a == null ? 0 : a.Availed //check if a is null       
}).ToList();