2013-07-10 32 views
1

我在下面的例子中得到一个空引用异常:防止空异常使用LINQ协会

我有用户的详细信息与相关的销(1 => 0..1)的列表。当我遇到没有关联引脚的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 } 
        }); 

我该如何预防?

使用这样的零COALESCE运营商将无法工作,因为u.Pin是零,我还是会得到空裁判例外:

u.Pin.UserPin ?? string.Empty

+1

偏差,但是,为什么'cell'的'对象[]'?好奇地用'object []'s来使用匿名类型。 – Jodrell

+0

不是100%确定(取自一个在线示例),但我很确定它与来自第三方控件(jqGrid)预期的json格式有关。 – woggles

回答

4

好,你可以做

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 
      } 
     }; 
    }); 
+0

谢谢!如此明显,现在我明白了 – woggles

1

没有多少可以在链除了检查做好每一参考对null,可能使用ternary conditional operator

var t = from UserDetail u in list      
     select new { 
      cell = new object[] { 
       u.UserId.ToString(), 
       u.UserName, 
       u.Password, 
       u.Pin != null && u.Pin.UserPin != null ? u.Pin.UserPin : "" 
      } 
     }; 
0

尝试是这样的:

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 
    };