【问题标题】:Mysql Linq There is already an open DataReader associated with this Connection which must be closed firstMysql Linq 已经有一个打开的 DataReader 与此 Connection 关联,必须先关闭
【发布时间】:2017-01-03 13:23:06
【问题描述】:

嵌套 SELECT 时发生异常。如果您注释掉属性照片、生日和住所,那么一切正常。如何重写查询以使其正常工作?

  var predicate = PredicateBuilder.True<Persons>();
    var query = this._entity.Persons.AsExpandable();

                    #region 
                    if (!String.IsNullOrEmpty(currentPerson.PersonName))
                    {
                        predicate = predicate.And(i => i.PersonName.Contains(currentPerson.PersonName.Trim()));
                    }

                    if (!String.IsNullOrEmpty(currentPerson.PersonLastName))
                    {
                        predicate = predicate.And(i => i.PersonLastName.Contains(currentPerson.PersonLastName.Trim()));
                    }

                    if (!String.IsNullOrEmpty(currentPerson.PersonPatronymic))
                    {
                        predicate = predicate.And(i => i.PersonPatronymic.Contains(currentPerson.PersonPatronymic.Trim()));
                    }
    ...........

    var result = query.Where(predicate).AsEnumerable().Select(o => new POCO.PersonResult
  {
    Id        = (int)o.Id,
    Photo     = o.persons_photos.Select(s => s.PersonFrontView).FirstOrDefault(),
    FullName  = String.Format("{0} {1} {2}", o.PersonLastName, o.PersonName, o.PersonPatronymic),
    Birthday  = o.persons_passport_data.Select(s => s.PersonBirthday).FirstOrDefault().ToString()
    Residence = o.persons_registration
                                    .Select(s =>
                                            String.Join(", ", ListModel.GetCountry(s.PersonCountryId),
                                                              ListModel.GetRegion(s.PersonRegionId),
                                                              ListModel.GetCity(s.PersonCityId))).FirstOrDefault()
                    }).ToList();

【问题讨论】:

    标签: c# mysql linq


    【解决方案1】:

    看起来 MySql 连接器不支持 MARS(多个活动结果集)并且您的 LINQ to Objects 查询(在 AsEnumerable() 调用之后)涉及延迟加载(o.persons_photoso.persons_passport_datao.persons_registration 导航属性)在主要数据读取器仍在执行时需要额外的读取器。

    最好的办法是通过删除 AsEnumerable() 调用让整个查询作为单个 SQL 查询执行,但由于投影使用不受支持的方法,我想唯一的选择是将 AsEnumerable() 调用替换为 @987654327 @,这将确保在延迟加载导航属性时主数据读取器是完整的。

    您可以尝试的另一件事是通过添加几个 Include 调用来急切加载它们(假设您使用的是 EF):

    var query = this._entity.Persons
        .Include(o => o.persons_photos)
        .Include(o => o.persons_passport_data)
        .Include(o => o.persons_registration)
        .AsExpandable();
    
    // the rest (same as yours) ...
    

    【讨论】:

    • 多个活动结果集是否是一个选项 murash?否则我也在考虑包含选项。
    • “MySQL MARS”的快速谷歌显示不支持它们(因此无法打开 MSSQL 提供程序等)
    猜你喜欢
    • 1970-01-01
    • 2019-01-17
    • 2020-09-25
    • 2011-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-25
    • 2011-07-23
    相关资源
    最近更新 更多