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