Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Linq:当对象为null时,将引发异常_C#_Asp.net_Linq - Fatal编程技术网

C# Linq:当对象为null时,将引发异常

C# Linq:当对象为null时,将引发异常,c#,asp.net,linq,C#,Asp.net,Linq,我很难回答一个问题 string userId = User.Identity.GetUserId(); var houseViewModel = this.Data.Houses.All() .Where(u => u.UserId == userId && u.Name == houseName) .Select(h => new HouseViewModel {

我很难回答一个问题

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();     
当他来到没有传感器抛出异常的房间时,因为SensorViewModel的Id是不可为空的属性

SensorViewModel = new SensorViewModel
{ 
    Id = r.Sensor.Id,
下一次尝试。只选择带有传感器的房间

  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,

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

我喜欢这个语法LINQ和属性的对象初始值设定项,但是…你不认为你没有被迫使用它吗?当它开始变得太难读取时,也许是时候回到旧的好方法了?无法创建“SmartHome.Web.Models.SensorViewModel”类型的空常量值。在此上下文中仅支持实体类型、枚举类型或基元类型。修复示例-只需创建新的空SensorViewModel,而不是传递空值类型“SmartHome.Web.Models.SensorViewModel”在单个LINQ to Entities查询中的两个结构不兼容的初始化中出现。一个类型可以在同一查询中的两个位置初始化,但前提是在两个位置设置了相同的属性,并且这些属性的设置顺序相同。我找不到解决此问题的方法。我添加了另一个示例-仅使用传感器选择行。
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();