简体   繁体   中英

Linq: When object is null an exception is thrown

I am having difficulty with a query.

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();     

When he came to the room in which no sensor throws exception because Id for SensorViewModel is a non-nullable property.

SensorViewModel = new SensorViewModel
{ 
    Id = r.Sensor.Id,
SensorViewModel = r.Sensor == null ? new SensorViewModel() : new SensorViewModel
{
  Id = r.Sensor.Id,
  CurrentTemp = r.Sensor.CurrentTemp,
},                           

next try. Simple select only rooms with sensor.

  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,

        },                           
    })

last attempt, select data from EF into list and then make 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();

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM