2017-01-03 3 views
0

Исключение происходит, когда вложенный SELECT. Если вы закомментируете свойства Фото, День рождения и Резиденция, тогда все будет работать. Как переписать запрос, чтобы он работал?Mysql Linq Уже открыт DataReader, связанный с этим соединением, который должен быть закрыт первым

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

ответ

2

Похоже, разъем MySql не поддерживает MARS (Multiple активные наборы результатов) и ваш LINQ к объектам запроса (после AsEnumerable() вызова) вовлекает отложенную загрузку (o.persons_photos, o.persons_passport_data и o.persons_registration навигационные свойства), которые требуют дополнительных читателей в то время как основной считыватель данных все еще выполняется.

Лучше всего было бы, чтобы весь запрос выполнить в виде одного запроса SQL, удалив AsEnumerable() вызов, но так как проекция использует недопустимые методы, я думаю, единственный вариант для замены AsEnumerable() вызова с ToList(), который обеспечит основной считыватель данных завершен в то время, когда свойства навигации ленивы загружены.

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

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) ... 
+0

кратна активный результат устанавливает опцию, murash? В противном случае я тоже думал об опции включения. –

+0

Быстрый Google для «MySQL MARS» показывает, что они не поддерживаются (следовательно, не могут быть включены, как для провайдера MSSQL и т. Д.). –

Смежные вопросы

 Смежные вопросы