Я использую этот запрос в контроллере для создания списка из четырех таблиц:
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, связанный с этим соединением, который должен быть закрыт первым
Как я могу справиться с этой ошибкой?
Я думаю, вы должны использовать 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()
чтобы добавить связанные объекты в один оператор при работе с несколькими запросами.
Аналогичная проблема:
DEL_INDEX
равно максимальному DEL_INDEX всех записей -1.