Linq:当object为null时,抛出异常

Kal*_*kov 0 c# linq asp.net

我在查询时遇到困难.

string userId = User.Identity.GetUserId();         
var houseViewModel = this.Data.Houses.All()                
    .Where(u => u.UserId == userId && u.Name == houseName)
    .Select(h => new HouseViewModel
    {                   
        Id = h.Id,
        Name = h.Name,
        ImageUrl = h.ImageUrl,                   
        FloorsViewModel = h.Flo?rs.Where(f=>f.Id>0) 
        .Select(f => new FloorViewModel
        {
            Name = f.Name,
            RoomViewModel = f.Rooms.Where(r => r.Id > 0) 
            .Select(r => new RoomViewModel
            {
                Id = r.Id,
                Name = r.Name,                           
                SensorViewModel = new SensorViewModel
                {
                    Id = r.Sensor.Id,
                    CurrentTemp = r.Sensor.CurrentTemp,

                },                           
            })
        })
    })
   .SingleOrDefault();     
Run Code Online (Sandbox Code Playgroud)

当他来到其中没有传感器抛出异常的房间,因为Id对于SensorViewModel一个非空的属性.

SensorViewModel = new SensorViewModel
{ 
    Id = r.Sensor.Id,
Run Code Online (Sandbox Code Playgroud)

Dmy*_*nko 7

SensorViewModel = r.Sensor == null ? new SensorViewModel() : new SensorViewModel
{
  Id = r.Sensor.Id,
  CurrentTemp = r.Sensor.CurrentTemp,
},                           
Run Code Online (Sandbox Code Playgroud)

接下来试试.简单选择仅带传感器的房间.

  RoomViewModel = f.Rooms.Where(r => r.Id > 0 && r.Sensor != null) 
    .Select(r => new RoomViewModel
    {
        Id = r.Id,
        Name = r.Name,                           
        SensorViewModel = new SensorViewModel
        {
            Id = r.Sensor.Id,
            CurrentTemp = r.Sensor.CurrentTemp,

        },                           
    })
Run Code Online (Sandbox Code Playgroud)

最后一次尝试,从EF中选择数据到列表,然后生成viewmodel

var house = this.Data.Houses.All()                
    .Where(u => u.UserId == userId && u.Name == houseName).ToList();
var houseViewModel = house.Select(h => new HouseViewModel
    {                   
        Id = h.Id,
        Name = h.Name,
        ImageUrl = h.ImageUrl,                   
        FloorsViewModel = h.Flo?rs.Where(f=>f.Id>0) 
        .Select(f => new FloorViewModel
        {
            Name = f.Name,
            RoomViewModel = f.Rooms.Where(r => r.Id > 0) 
            .Select(r => new RoomViewModel
            {
                Id = r.Id,
                Name = r.Name,                           
                SensorViewModel =r.Sensor == null ? null : new SensorViewModel
                {
                    Id = r.Sensor.Id,
                    CurrentTemp = r.Sensor.CurrentTemp,

                },                           
            })
        })
    })
   .SingleOrDefault();
Run Code Online (Sandbox Code Playgroud)