, потому что _roleManager.Roles.Where(a => userRoles.Contains(a.Name)
создает IEnumerator, который сохраняет соединение открытым, когда он пытается
сделать await _roleManager.GetClaimsAsync(role)
снова .. он видит, что у него уже есть open DataReader associated
3.0, вероятно, сделал внутренний evaluates the LINQ expression in client side automatically
, вроде auto Tolist()
, вместо IEnumerator, который поддерживает соединение открытым.
Чтобы избежать этого, я бы сделал ниже для всего будущего и текущего кода , Таким образом, это не имеет значения, также убедитесь, что не выполняются операторы IEnumerator, которые повторно выполняют весь оператор.
Кроме того, это дает дополнительное преимущество, заключающееся в том, что вы можете отлаживать список до l oop.
Прежде чем кто-то скажет, что это потребляет больше памяти, покажите мне тест, показывающий так ... Это не использует yield, и компилятор, вероятно, достаточно умен, чтобы оптимизировать все, что он считает ненужным.
Здесь они говорят, что проблема IEnumerator лучше, но то же самое.
Обновление Entity Framework до 6.1.0 с 6.1.x прерывает определенные запросы, если я не включаю MARS
List<Claim> claims = new List<Claim>();
var userRoles = await _userManager.GetRolesAsync(user);
//you could change this to use async and await
//var roles = await _roleManager.Roles.Where(a => userRoles.Contains(a.Name)).ToListAsync();
var roles = _roleManager.Roles.Where(a => userRoles.Contains(a.Name)).ToList();
foreach (var role in roles)
{
claims.AddRange(await _roleManager.GetClaimsAsync(role));
}
return claims;