Linq左连接null引用错误

时间:2016-03-17 16:36:46

标签: c# linq

当我进行左连接时,我有这个错误。如果id的doenot相交,如何防止错误?

  

未处理的异常:System.NullReferenceException:对象引用   没有设置为对象的实例。

class Program
{
    static void Main(string[] args)
    {
        List<Component> firstlist = new List<Component>();
        List<Component> secondlist = new List<Component>();
        firstlist.Add(new Component { id = 1, Name = "Jhon" });
        secondlist.Add(new Component { id = 2, Name = "Jhon" });

        var test = from d in firstlist
                                 join i in secondlist
                                 on d.id equals i.id
                                 into a
                                 from b in a.DefaultIfEmpty()
                                 select new Component { id = b.id, Name = b.Name };
        List<Component> Result = test.ToList();
    }

    public class Component
    {
        public int id { get; set; }

        public string Name { get; set; }
    }
}

3 个答案:

答案 0 :(得分:2)

尝试以下内容:

class Program
{
    static void Main(string[] args)
    {
        List<Component> firstlist = new List<Component>();
        List<Component> secondlist = new List<Component>();
        firstlist.Add(new Component { id = 1, Name = "Jhon" });
        secondlist.Add(new Component { id = 2, Name = "Jhon" });

        var test = from d in firstlist
                                 join i in secondlist
                                 on d.id equals i.id
                                 into a
                                 from b in a.DefaultIfEmpty()
                                 select new Component { id = (b != null) ?b.id : default(int), Name = (b != null) ? b.Name : default(string) };
        List<Component> Result = test.ToList();
    }

    public class Component
    {
        public int id { get; set; }

        public string Name { get; set; }
    }
}

如您所见,我在设置之前在b上添加了空检查。

select new Component { id = (b != null) ? b.id : default(int), Name = (b != null) ? b.Name : default(string) };

你也可能会做类似

的事情
select (b == null) ? default(Component) : new Component { id = b.id, Name = b.Name };

我不是百分之百确定第二个选项的语法,但是这样的东西可能有效。

答案 1 :(得分:1)

要解决此问题,您需要确保在调用/使用其方法/属性/字段之前b不是null。改变这个:

select new Component { id = b.id, Name = b.Name };

成:

select new Component { id = b == null ? 0 : b.id, Name = b == null ? null : b.Name };

在C#6中,您可以使用空条件运算符?.

select new Component { id = b?.id ?? 0, Name = b?.Name };

答案 2 :(得分:0)

你的问题在于

select new Component { id = b.id, Name = b.Name };

使用a.DefaultIfEmpty()可以返回NULL,因此b.id将抛出异常。 正确的代码应该是:

select new Component { id = b==null?return_safe_value:b.id, Name =b==null?rturn_safe_value:b.Name };