简体   繁体   English

Linq:当object为null时,将引发异常

[英]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 Id是不可为空的属性。

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 最后一次尝试,从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();

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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