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

FSo*_*ou1 4 .net c# 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 });
    });
}
Run Code Online (Sandbox Code Playgroud)

但不幸的是Dapper.Query<T>返回IEnumerable<T>.

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

Mar*_*ell 16

Dapper只保证交给你一个IEnumerable<T>.所以你应该只假设这一点.特别是,它已经拥有了不同的场景中它可以给你任何一个填充的列表,延期迭代器.

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

static IList<T> SpeculativeToList<T>(this IEnumerable<T> source)
{
    return source as IList<T> ?? source.ToList();
}
Run Code Online (Sandbox Code Playgroud)


Sel*_*enç -3

尝试使用显式强制转换

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

  • @FSou1 我是主要作者之一,但我不同意;) (4认同)