C# 使用Linq关联防止空异常

C# 使用Linq关联防止空异常,c#,linq,entity-framework,entity-framework-5,C#,Linq,Entity Framework,Entity Framework 5,在以下示例中,我得到一个空引用异常: 我有一个用户详细信息列表和相关联的PIN(1=>0..1)。当我遇到一个没有关联pin的UserDetail记录时,当访问u.pin.UserPin时,我会得到一个空引用异常,这是可以理解的 var t = from UserDetail u in list select new { ce

在以下示例中,我得到一个空引用异常:

我有一个用户详细信息列表和相关联的PIN(1=>0..1)。当我遇到一个没有关联pin的UserDetail记录时,当访问
u.pin.UserPin
时,我会得到一个空引用异常,这是可以理解的

  var t = from UserDetail u in list                    
                    select new
                    {
                        cell = new object[] { u.UserId.ToString(), u.UserName, u.Password, u.Pin.UserPin }
                    });
我怎样才能防止这种情况

像这样使用null coalesce操作符是行不通的,因为
u.Pin
为null,我仍然会得到null ref异常:

u.Pin.UserPin??string.Empty

嗯,您可以这样做

u.Pin == null ? string.Empty : u.Pin.UserPin
或者,如果你觉得它更可读

list.Select(u =>
    {
        var pin = string.Empty;
        if (u.Pin != null)
        {
            pin = u.Pin.UserPin;
        }

        return new
        {
            Cell = new object[]
            {
                u.UserId.ToString(),
                u.UserName, 
                u.Password,
                pin
            }
        };
    });
好吧,你可以

u.Pin == null ? string.Empty : u.Pin.UserPin
或者,如果你觉得它更可读

list.Select(u =>
    {
        var pin = string.Empty;
        if (u.Pin != null)
        {
            pin = u.Pin.UserPin;
        }

        return new
        {
            Cell = new object[]
            {
                u.UserId.ToString(),
                u.UserName, 
                u.Password,
                pin
            }
        };
    });

除了对照
null
检查链中的每个引用之外,您可以做的不多,可能使用:


除了对照
null
检查链中的每个引用之外,您可以做的不多,可能使用:


试着这样做:

  from c in dataContext.Customers
  from p in c.Purchases.DefaultIfEmpty( )
select new
  {
     c.Name,
     Descript = p == null ? null : p.Description,
     Price = p == null ? (decimal?) null : p.Price
  };

试着这样做:

  from c in dataContext.Customers
  from p in c.Purchases.DefaultIfEmpty( )
select new
  {
     c.Name,
     Descript = p == null ? null : p.Description,
     Price = p == null ? (decimal?) null : p.Price
  };

但是,为什么
单元格
对象[]
?我很好奇将匿名类型与
object[]
s一起使用。不是100%确定(取自一个在线示例),但我很确定它与第三方控件(jqGrid)预期的json格式有关。但是,为什么
cell
object[]
?我很好奇将匿名类型与
object[]
s一起使用。不是100%确定(取自一个在线示例),但我很确定它与第三方控件(jqGrid)预期的json格式有关。