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