当我进行左连接时,我有这个错误。如果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; }
}
}
答案 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 };