我的意思是两个不平等的名单:
列表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
只是为了证据:
答案 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();