我在下面用这种代码获得了“未设置对象引用”。
添加DefaultIfEmpty()
以进行左连接时出现问题。
但我需要在报告中看到PLACE
的第4项没有lst1
。
如何获得PLACE
为null
的行?
这是我在LinqPad中的代码示例。
如果您取消注释该行:new ID (){id1 = 10152 , id2 = null}
,则会收到错误。
var Lst1 = new List<ID>
{
new ID (){id1 = 10152 , id2= 250},
new ID (){id1 = 10152 , id2 = 1},
new ID (){id1 = 10152 , id2= 106},
//new ID (){id1 = 10152 , id2 = null}
};
var Lst2 = new List<STORE>
{
new STORE () {sto1 = 10152 , sto2 = "General Store"}
};
var Lst3 = new List<PLACE>
{
new PLACE () {pla1 = 250 , pla2 = "London"},
new PLACE () {pla1 = 1 , pla2 = "Paris"},
new PLACE () {pla1 = 106 , pla2 = "Miami"}
};
var regsup =
(from l in Lst1
join st in Lst2 on l.id1 equals st.sto1
join pl in Lst3 on l.id2 equals pl.pla1 into pll
from plll in pll.DefaultIfEmpty()
select new
{
StoID = st.sto1,
Store = st.sto2,
PlaceID = plll.pla1,
Place = plll.pla2
}).Distinct();
regsup.Dump();
}
class ID
{
public decimal id1 { get; set; }
public decimal? id2 { get; set; }
}
class STORE
{
public decimal sto1{ get; set; }
public string sto2{ get; set; }
}
class PLACE
{
public decimal pla1{ get; set; }
public string pla2{ get; set; }
}
答案 0 :(得分:2)
在访问其任何属性之前,您需要检查以确保plll
不为空。 DefaultIfEmpty()
返回一个默认对象,在本例中为null
。
您的选择语句必须是:
select new
{
StoID = st.sto1,
Store = st.sto2,
PlaceID = plll != null ? plll.pla1 : 0,
Place = plll != null ? plll.pla2 : ""
}).Distinct();
或者如果使用C#6,你可以拥有:
PlaceID = plll?.pla1,
Place = plll?.pla2