Conversión entre IEnumerable y IList (resultado de devolución de Dapper)

.net asp.net-mvc c# dapper

Pregunta

Hay una firma del método UserManager (implementación predeterminada de ASP .NET Identity Core):

public Task<IList<string>> GetRolesAsync(User user) {
    const string query = @"
                select r.[Name]
                  from [UserRoles] ur
             left join [Roles] r on r.RoleId = ur.RoleId
                 where ur.UserId = @userId;
    ";

    return Task.Factory.StartNew(() => {
        using (SqlConnection connection = new SqlConnection(_connectionString))
            return connection.Query<string>(query, new { userId = user.UserId });
    });
}

Desafortunadamente, Dapper.Query<T> devuelve IEnumerable<T> .

¿Es posible devolver IList<T> o tengo que hacer la conversión yo mismo?

Respuesta aceptada

Intenta usar un reparto explícito

return (IList<string>)connection.Query<string>(query, new { userId = user.UserId });

Respuesta experta

Dapper solo garantiza entregarte un IEnumerable<T> . Entonces solo debes asumir eso. En particular, ya cuenta con diferentes escenarios en los que se le puede dar una lista o bien poblada, o un iterador diferido.

El enfoque más simple es simplemente llamar a .ToList() . Si intenta evitar una alloc, entonces haga una prueba especulativa:

static IList<T> SpeculativeToList<T>(this IEnumerable<T> source)
{
    return source as IList<T> ?? source.ToList();
}


Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow