Как выбрать специальный индекс модели в View?

0

Я использую этот запрос в контроллере для создания списка из четырех таблиц:

var ViewModel = (from APP in db1.application
                 where APP.APP_STATUS == "TO_DO"
                 join APPDEL in db1.app_delegation on APP.APP_UID equals APPDEL.APP_UID
                 join Con in db1.content on APPDEL.TAS_UID equals Con.CON_ID
                 join BPMNPRC in db1.bpmn_process on APPDEL.PRO_UID equals BPMNPRC.PRJ_UID
                 join RUSRE in db1.rbac_users on APP.APP_INIT_USER equals RUSRE.USR_UID
                 where APPDEL.TAS_UID == Con.CON_ID 
                    && Con.CON_CATEGORY == ("TAS_TITLE")
                    && APP.APP_UID == APPDEL.APP_UID 
                    && APPDEL.DEL_THREAD_STATUS == "OPEN" 
                    && APPDEL.USR_UID == bpmUseid.BPMSID
                 select new ApplicationContentViewModel
                         {
                             creator = RUSRE,
                             app_delegation = APPDEL,
                             application = APP,
                             content = Con,
                             task = BPMNPRC,
                         }).AsEnumerable();
return View(ViewModel);

Но мне нужно выбрать специальную запись в APPDEL (app_delegation), а затем получить имя этой записи.

Я использую эту команду для выбора элемента по полю DEL_INDEX:

@foreach (var item in Model)
{
  <th>                                                    
  @(item.app_delegation.DEL_INDEX == Model.Max(x => x.app_delegation.DEL_INDEX) - 1 ? item.creator.USR_LASTNAME : "");
 </th>  
}

Фактически, я хочу выбрать максимальное значение DEL_INDEX - 1 и получить его фамилию.

К сожалению, я получаю эту ошибку:

System.Data.Entity.Core.EntityCommandExecutionException :: 'Произошла ошибка при выполнении определения команды. Подробнее см. Внутреннее исключение. '

Внутреннее исключение:

MySqlException: есть уже открытый DataReader, связанный с этим соединением, который должен быть закрыт первым

Как я могу справиться с этой ошибкой?

Теги:
asp.net-mvc
error-handling
datareader

1 ответ

1
Лучший ответ

Я думаю, вы должны использовать ToList() вместо AsEnumerable() перед выполнением выражения Model.Max(x => x.app_delegation.DEL_INDEX) как показано ниже:

var ViewModel = (from APP in db1.application
                 where APP.APP_STATUS == "TO_DO"
                 join APPDEL in db1.app_delegation on APP.APP_UID equals APPDEL.APP_UID
                 join Con in db1.content on APPDEL.TAS_UID equals Con.CON_ID
                 join BPMNPRC in db1.bpmn_process on APPDEL.PRO_UID equals BPMNPRC.PRJ_UID
                 join RUSRE in db1.rbac_users on APP.APP_INIT_USER equals RUSRE.USR_UID
                 where APPDEL.TAS_UID == Con.CON_ID 
                 && Con.CON_CATEGORY == ("TAS_TITLE")
                 && APP.APP_UID == APPDEL.APP_UID 
                 && APPDEL.DEL_THREAD_STATUS == "OPEN" 
                 && APPDEL.USR_UID == bpmUseid.BPMSID
                 select new ApplicationContentViewModel
                 {
                     creator = RUSRE,
                     app_delegation = APPDEL,
                     application = APP,
                     content = Con,
                     task = BPMNPRC,
                 }).ToList(); // here is the change

объяснение

AsEnumerable() считыватель данных остается открытым и при выполнении Model.Max() поскольку LINQ to Objects Model.Max() исключение из-за используемого MySQL-коннектора, не поддерживает MARS (несколько активных наборов результатов). Использование ToList() гарантирует, что операция чтения данных будет завершена, когда ленивая загрузка проверяет все свойства навигации.

Примечание:

Предположим, что вы используете EF, попробуйте загрузить загрузку с помощью Include() чтобы добавить связанные объекты в один оператор при работе с несколькими запросами.

Аналогичная проблема:

Mysql Linq Существует уже открытый DataReader, связанный с этим соединением, который должен быть закрыт первым

  • 0
    Я исправляю это. Ошибка была удалена, но я не смог отобразить мой любимый предмет. Можете ли вы помочь мне для отображения имени элемента, значение которого DEL_INDEX равно максимальному DEL_INDEX всех записей -1.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню