【问题标题】:How can I select special Index of model in View?如何在视图中选择模型的特殊索引?
【发布时间】:2018-04-05 20:03:27
【问题描述】:

我在控制器中使用这个查询从连接四个表中创建一个列表:

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 与此 Connection 关联,必须先关闭

我该如何处理这个错误?

【问题讨论】:

    标签: mysql asp.net-mvc error-handling datareader


    【解决方案1】:

    我认为你应该在执行表达式Model.Max(x =&gt; x.app_delegation.DEL_INDEX)之前使用ToList()方法而不是AsEnumerable(),如下所示:

    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 时由于您使用的MySQL 连接器不支持MARS(多个活动结果集)而引发异常。使用ToList() 方法可确保在延迟加载检查所有导航属性时完成数据读取器操作。

    旁注:

    假设您使用的是 EF,请尝试使用 Include() 预先加载,以便在处理多个查询时在单个语句中添加相关对象。

    类似问题:

    Mysql Linq There is already an open DataReader associated with this Connection which must be closed first

    【讨论】:

    • 我更正了。错误已删除,但在我无法显示我最喜欢的项目。你能帮我显示 DEL_INDEX 的值等于所有记录的最大 DEL_INDEX -1 的项目名称吗?
    猜你喜欢
    • 1970-01-01
    • 2011-01-13
    • 2020-04-05
    • 2015-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-28
    • 1970-01-01
    相关资源
    最近更新 更多