2015-08-27 3 views
1
foreach(var name in _cust.Select(s => s.Username).Distinct()) 
{ 
    var x = _cust.Select(s => s.Username == name); //ERROR HERE 
    //rest of the code here 
} 

выбросит There is already an open DataReader associated with this Command which must be closed first. исключение, однако это не происходит, когда я добавляю .ToList().Ошибка при попытке перебрать Queryable

Я искал вокруг до сих пор, но не нашел удовлетворительного ответа. Поэтому мой вопрос:

  1. Есть ли другой способ сделать это помимо добавления .ToList()?
  2. Если я использую в качестве решения .ToList(), это вызовет проблемы с производительностью при его производстве? Потому что AFAIK ToList() попытается загрузить все в память.
  3. У меня есть много навигационных свойств в моих сущностях, будет ToList() попытался загрузить все внутри свойств навигации?

Благодаря

+0

что _cust? Почему вы беспокоитесь о создании 'ToList()', поскольку вы используете foreach (поэтому вы все равно перечисляете все свои 'UserName'? –

+0

_cust - это' DbSet'. Без '.ToList()' он будет вызывать исключение ' Существует уже открытый DataReader, связанный с этой Командой, который должен быть закрыт первым. 'См. Это http://stackoverflow.com/questions/4867602/entity-framework-there-is-already-an-open-datareader-associated-with -this-comma – warheat1990

+0

1. Я думаю, что ошибка происходит при вычислении _cust. Кажется, что время выполнения важно в этом контексте (toList-> после выполнения vs foreach() -> в этой строке) 2. ToList() будет перечислять запрос, foreach делает то же самое 3. Это зависит от вашего запроса, что означает: как долго ваш контекст открыт? Вы включаете что-нибудь? Используете ли вы AsNoTracking()? – DevilSuichiro

ответ

0

есть ли другой способ сделать это помимо добавления .ToList()?

Я думаю, enabling MARS в вашей строке может быть альтернативой ToList().

Если я использую .ToList() в качестве решения, это вызовет проблему с производительностью при ее выходе?

Это зависит от количества различных USERNAMES в базе данных

Поскольку AFAIK ToList() будет пытаться загрузить все в памяти.

Это будет просто пытаться загрузить все различные USERNAMES в памяти

У меня есть много навигационных свойства в моих субъектах, будет ToList() пыталась загрузить все внутри навигационные свойства?

Нет, он выполнит соответствующий запрос и произведет проекцию в столбце UserName.

ИМХО, это хорошая практика, чтобы monitor generated queries in debug mode

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