Entityframework Уже есть открытый DataReader, связанный с этой Командой, который должен быть закрыт первым

У меня есть следующий код, который извлекает данные из таблицы клиентов

var customers= context.CustomerEntities.Include("Addresses").Select(Mapper.Map).ToList();

Функция mapper отображает объект сущности в бизнес-объект и выглядит так:

    internal static Customer Map(CustomerEntity entity)
    {
        if (entity == null)
            return null;

        return new Customer
        {
            Id = entity.Id,
            Name = entity.Name,
            Addresses = Map(entity.Addresses)

        };
    }

Теперь приведенный выше код работает хорошо.

Однако, когда я пытаюсь сделать это:

var customers= context.CustomerEntities.Select(Mapper.Map).ToList();

Я получаю сообщение об ошибке: There is already an open DataReader associated with this Command which must be closed first, когда выполняется функция Mapper.

Теперь я знаю, что для решения этой проблемы мне нужно установить multipleactiveresultsets=True в строку подключения. Я попробовал это, и это решило мою проблему.

Однако, когда я запускал профилировщик SQL, запрос всех клиентов из фреймворка сущности автоматически извлекал все адреса, даже если они мне не нужны.

Есть ли обходной путь помимо установки multipleactiveresultsets=True? Я не хочу, чтобы адреса были ленивы загружены все время.

Ответ 1

Я считаю, что это потому, что для каждого Customer оператор select заставляет снова идти и читать базу данных. Почему бы вам не сделать сначала ToList(), а затем применить сопоставление (Select) примерно так:

var customers= context.CustomerEntities.ToList().Select(Mapper.Map);

Я считаю, что это сначала приведет данные, а затем сделает сопоставление, и у вас не будет этой проблемы.