Я использую linq, и я получаю сообщение об ошибке "Существует уже открытый datareader, связанный с этой командой, который должен быть закрыт первым"

66
6

dc.Accounts.Where(a => blogs.Select(b => b.AccountID).Distinct()
.Contains(a.AccountID));
foreach (Blog blog in blogs)
{
blog.Account = accounts.Where(a => a.AccountID == blog.AccountID)
.FirstOrDefault();

//this is done to access account outside ObjectContext
blog.account = blog.Account;
}


В этом коде я получаю значение до блога цикла foreach, но затем я получаю сообщение об ошибке


Уже существует открытый datareader, связанный с этой командой, который должен быть закрыт первым.


спросил(а) 2011-08-25T08:44:00+04:00 8 лет, 10 месяцев назад
1
Решение
85

Это обычно возникает, когда у вас есть внешний и внутренний запрос, а внешний все еще работает. Обычно вы можете исправить это, заставив внешний запрос завершить; достаточно просто добавить ToList():

var blogs = dc.Accounts.Where(a => blogs.Select(b => b.AccountID).Distinct()
.Contains(a.AccountID)).ToList(); // <======= here

ответил(а) 2011-08-25T10:30:00+04:00 8 лет, 10 месяцев назад
54

Вам нужно включить Несколько активных наборов результатов.


Измените строку подключения, чтобы включить MultipleActiveResultSets


string connectionString = "Data Source=MSSQL1;" + 
"Initial Catalog=AdventureWorks;Integrated Security=SSPI" +
"MultipleActiveResultSets=True";

Поскольку вы получаете доступ к некоторым навигационным свойствам внутри цикла, вы можете столкнуться с проблемой Select N+1. Вы можете избежать этого, пытаясь загрузить.


например:


dc.Accounts.Include("Blogs").Where(a => blogs.Select(b => b.AccountID).Distinct()
.Contains(a.AccountID));

ответил(а) 2011-08-25T08:53:00+04:00 8 лет, 10 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема