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
Я искал вокруг до сих пор, но не нашел удовлетворительного ответа. Поэтому мой вопрос:
- Есть ли другой способ сделать это помимо добавления
.ToList()
? - Если я использую в качестве решения
.ToList()
, это вызовет проблемы с производительностью при его производстве? Потому что AFAIKToList()
попытается загрузить все в память. - У меня есть много навигационных свойств в моих сущностях, будет
ToList()
попытался загрузить все внутри свойств навигации?
Благодаря
что _cust? Почему вы беспокоитесь о создании 'ToList()', поскольку вы используете foreach (поэтому вы все равно перечисляете все свои 'UserName'? –
_cust - это' DbSet'. Без '.ToList()' он будет вызывать исключение ' Существует уже открытый DataReader, связанный с этой Командой, который должен быть закрыт первым. 'См. Это http://stackoverflow.com/questions/4867602/entity-framework-there-is-already-an-open-datareader-associated-with -this-comma – warheat1990
1. Я думаю, что ошибка происходит при вычислении _cust. Кажется, что время выполнения важно в этом контексте (toList-> после выполнения vs foreach() -> в этой строке) 2. ToList() будет перечислять запрос, foreach делает то же самое 3. Это зависит от вашего запроса, что означает: как долго ваш контекст открыт? Вы включаете что-нибудь? Используете ли вы AsNoTracking()? – DevilSuichiro