IEnumerable到IList之间的转换(Dapper返回结果)

时间:2014-02-08 13:38:36

标签: c# .net asp.net-mvc dapper

UserManager方法的签名(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 });
    });
}

但遗憾的是Dapper.Query<T>会返回IEnumerable<T>

是否有可能返回IList<T>或我必须自己进行转换?

3 个答案:

答案 0 :(得分:15)

Dapper只保证给你一个IEnumerable<T>。所以你应该只假设这一点。特别是,它已经有不同的场景,它可以为您提供 填充列表,延迟迭代器。

最简单的方法是拨打.ToList()。如果您打算避免使用alloc,那么可以进行推测测试:

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

答案 1 :(得分:2)

只需拨打.ToList()就可以了吗?

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

这将枚举IEnumerable<T>并创建一个内容副本,其中包含List<T>找到的所有元素。

答案 2 :(得分:-3)

尝试使用显式强制转换

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