LINQ查询与列表<t>“对象引用未设置为对象的实例。”

时间:2016-06-18 21:22:50

标签: c# linq list linqpad object-reference

我在下面用这种代码获得了“未设置对象引用”。 添加DefaultIfEmpty()以进行左连接时出现问题。 但我需要在报告中看到PLACE的第4项没有lst1

如何获得PLACEnull的行? 这是我在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; }
}

1 个答案:

答案 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