使用Linq关联防止null异常

时间:2013-07-10 13:22:45

标签: c# linq entity-framework entity-framework-5

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

我有一个包含相关引脚的用户详细信息列表(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 }
                    });

我该如何防止这种情况?

使用像这样的null coalesce运算符将不起作用,因为u.Pin为null并且我仍然会得到null ref异常:

u.Pin.UserPin ?? string.Empty

3 个答案:

答案 0 :(得分: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
            }
        };
    });

答案 1 :(得分: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 : ""
            }
        };

答案 2 :(得分: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
  };