IEnumerable 无法设置元素
IEnumerable failed to set element
我有一个 ViewModel,它包含不同表中的不同元素,我倾向于通过查询分配给它。
我的问题是我无法使用 IEnumerable
执行此操作(在下面的 GetAll()
中),它一直返回我 null
RoomCode
但对于单个项目(在下面的 GetDeviceId()
中)然后它工作正常。
public IEnumerable<DeviceViewModel> GetAll()
{
var result = deviceRepository.GetAll().Select(x => x.ToViewModel<DeviceViewModel>());
for(int i = 0; i < result.Count(); i++)
{
int? deviceID = result.ElementAt(i).DeviceId;
result.ElementAt(i).RoomCode = deviceRepository.GetRoomCode(deviceID);
}
return result;
}
public DeviceViewModel GetDeviceID(int deviceID)
{
var result = new DeviceViewModel();
var device = deviceRepository.Find(deviceID);
if (device != null)
{
result = device.ToViewModel<DeviceViewModel>();
result.RoomCode = deviceRepository.GetRoomCode(deviceID);
}
else
{
throw new BaseException(ErrorMessages.DEVICE_LIST_EMPTY);
}
return result;
}
public string GetRoomCode(int? deviceID)
{
string roomCode;
var roomDevice = dbContext.Set<RoomDevice>().FirstOrDefault(x => x.DeviceId == deviceID && x.IsActive == true);
if (roomDevice != null)
{
var room = dbContext.Set<Room>().Find(roomDevice.RoomId);
roomCode = room.RoomCode;
}
else
{
roomCode = "";
}
return roomCode;
}
首先,您需要将查询具体化为本地内存中的一个集合。否则,ElementAt(i)
将查询数据库并在每次使用时返回某种临时对象,丢弃您所做的任何更改。
var result = deviceRepository.GetAll()
.Select(x => x.ToViewModel<DeviceViewModel>())
.ToList(); // this will materialize the query to a list in memory
// Now modifications of elements in the result IEnumerable will be persisted.
然后您可以继续执行其余代码。
其次(可能是可选的),为了清楚起见,我还建议使用 foreach
来枚举元素。这是循环遍历 IEnumerable
:
的 C# 惯用方式
foreach (var element in result)
{
int? deviceID = element.DeviceId;
element.RoomCode = deviceRepository.GetRoomCode(deviceID);
}
我有一个 ViewModel,它包含不同表中的不同元素,我倾向于通过查询分配给它。
我的问题是我无法使用 IEnumerable
执行此操作(在下面的 GetAll()
中),它一直返回我 null
RoomCode
但对于单个项目(在下面的 GetDeviceId()
中)然后它工作正常。
public IEnumerable<DeviceViewModel> GetAll()
{
var result = deviceRepository.GetAll().Select(x => x.ToViewModel<DeviceViewModel>());
for(int i = 0; i < result.Count(); i++)
{
int? deviceID = result.ElementAt(i).DeviceId;
result.ElementAt(i).RoomCode = deviceRepository.GetRoomCode(deviceID);
}
return result;
}
public DeviceViewModel GetDeviceID(int deviceID)
{
var result = new DeviceViewModel();
var device = deviceRepository.Find(deviceID);
if (device != null)
{
result = device.ToViewModel<DeviceViewModel>();
result.RoomCode = deviceRepository.GetRoomCode(deviceID);
}
else
{
throw new BaseException(ErrorMessages.DEVICE_LIST_EMPTY);
}
return result;
}
public string GetRoomCode(int? deviceID)
{
string roomCode;
var roomDevice = dbContext.Set<RoomDevice>().FirstOrDefault(x => x.DeviceId == deviceID && x.IsActive == true);
if (roomDevice != null)
{
var room = dbContext.Set<Room>().Find(roomDevice.RoomId);
roomCode = room.RoomCode;
}
else
{
roomCode = "";
}
return roomCode;
}
首先,您需要将查询具体化为本地内存中的一个集合。否则,ElementAt(i)
将查询数据库并在每次使用时返回某种临时对象,丢弃您所做的任何更改。
var result = deviceRepository.GetAll()
.Select(x => x.ToViewModel<DeviceViewModel>())
.ToList(); // this will materialize the query to a list in memory
// Now modifications of elements in the result IEnumerable will be persisted.
然后您可以继续执行其余代码。
其次(可能是可选的),为了清楚起见,我还建议使用 foreach
来枚举元素。这是循环遍历 IEnumerable
:
foreach (var element in result)
{
int? deviceID = element.DeviceId;
element.RoomCode = deviceRepository.GetRoomCode(deviceID);
}